Cada parámetro tiene un nombre externo (en la llamada) y uno interno (en el cuerpo). Con _ se omite la etiqueta externa:
func saludar(a nombre: String, con saludo: String = "Hola") -> String {
"(saludo), (nombre)"
}
print(saludar(a: "Lucia", con: "Buenos dias"))
print(saludar(a: "Marco")) // usa valor por defecto
func sumar(_ a: Int, _ b: Int) -> Int { a + b }
print(sumar(3, 4)) // sin etiquetas
Parámetros variadic
Un parámetro variadic acepta cero o más valores del mismo tipo. Dentro de la función se trata como un array:
func media(_ numeros: Double...) -> Double {
guard !numeros.isEmpty else { return 0 }
return numeros.reduce(0, +) / Double(numeros.count)
}
print(media(1, 2, 3, 4, 5)) // 3.0
Múltiple retorno con tuplas
func extremos(_ arr: [Int]) -> (min: Int, max: Int)? {
guard !arr.isEmpty else { return nil }
return (arr.min()!, arr.max()!)
}
if let (min, max) = extremos([3, 1, 4, 1, 5, 9]) {
print("min=(min) max=(max)") // min=1 max=9
}
inout: modificar el argumento original
Swift pasa valores por copia. Con inout el parámetro se pasa por referencia y los cambios afectan al original:
func intercambiar(_ a: inout T, _ b: inout T) {
let tmp = a; a = b; b = tmp
}
var x = 1, y = 2
intercambiar(&x, &y)
print(x, y) // 2 1
Funciones como valores y funciones anidadas
func aplicar(_ f: (Int) -> Int, a valor: Int) -> Int { f(valor) }
func doble(_ n: Int) -> Int { n * 2 }
print(aplicar(doble, a: 5)) // 10
print(aplicar({ $0 * $0 }, a: 4)) // 16
func generarSaludo(formal: Bool) -> (String) -> String {
func formal_(_ n: String) -> String { "Estimado (n)" }
func informal(_ n: String) -> String { "Hey (n)!" }
return formal ? formal_ : informal
}
print(generarSaludo(formal: false)("Carlos")) // Hey Carlos!
