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.
Desafío
FácilDefine una función collect que:
- Toma un entero
ny un closurebuilder: (Int) -> String - Llama a
builderpara cadaidesde1hastan(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 finalLas 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 ","
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
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras