Menu
Coddy logo textTech

Trailing Closures

Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 39 de 56.

Cuando una clausura es el último argumento de una función, puedes escribirla fuera de los paréntesis. Esta es la forma de trailing-closure, y es así como el código de Swift se lee de manera natural.

let nums = [1, 2, 3]
// Forma estándar
let a = nums.map({ $0 * 2 })
// Forma de clausura de cierre
let b = nums.map { $0 * 2 }

Si el closure es el único argumento, los paréntesis también desaparecen. Es por eso que todo lo que has visto hasta ahora se lee como una estructura de control personalizada.

Puedes escribir tus propias funciones para que acepten clausuras de la misma manera:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

La forma de clausura final hace que repeatN(3) { ... } se lea como un bucle integrado. Esa es la idea: las estructuras de control que construyes tú mismo se ven exactamente como las de la biblioteca estándar.

challenge icon

Desafío

Fácil

Define una función collect que:

  • Toma un entero n y un closure builder: (Int) -> String
  • Llama a builder para cada i desde 1 hasta n (inclusive) y devuelve el array de las cadenas resultantes

Lee un entero de stdin, llama a collect con ese entero usando un trailing closure que produzca "i=<i>" para cada valor, e imprime el resultado unido con ,.

Para la entrada 4, la salida es i=1,i=2,i=3,i=4.

Hoja de referencia

Sintaxis de clausura final (trailing closure): cuando una clausura es el último argumento, se puede escribir fuera de los paréntesis. Si es el único argumento, los paréntesis se omiten por completo.

let nums = [1, 2, 3]
let a = nums.map({ $0 * 2 }) // estándar
let b = nums.map { $0 * 2 }  // clausura final

Las funciones personalizadas pueden aceptar clausuras de la misma manera, haciendo que se lean como estructuras de control integradas:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

Pruébalo tú mismo

let n = Int(readLine()!)!

// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// luego llama a collect(n) { ... } e imprime unido con ","
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo