Funciones en Swift: etiquetas de argumentos, variadic, inout y múltiple retorno

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!

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP