Conceptos básicos de Closures
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 38 de 56.
Un closure es un bloque de código autónomo que puedes pasar y llamar más tarde. La sintaxis completa especifica los tipos de parámetros y de retorno:
let double = { (n: Int) -> Int in
return n * 2
}
print(double(5)) // 10Swift puede inferir los tipos cuando el contexto es claro, por lo que rara vez se escribe la forma larga. Dentro de map, filter, etc., la abreviatura más corta es la norma:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // el más corto, $0 es el primer argumentoLos closures son valores, puedes almacenarlos en variables, devolverlos desde funciones y pasarlos como argumentos. Esa es la razón por la cual map funciona.
Desafío
FácilLee dos líneas de entrada:
- Un entero
x - Una lista de enteros separados por comas
Define tres clausuras (closures), cada una de tipo (Int) -> Int:
addXsumaxa su argumentosquaredevuelve el cuadrado del argumentonegatedevuelve el argumento negado
Aplica cada clausura a cada elemento de la lista usando map. Imprime tres líneas, una por cada clausura, con los resultados unidos por ,:
addX: ...
square: ...
negate: ...Para la entrada 10 en la línea 1 y 1,2,3 en la línea 2, la salida es:
addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3Hoja de referencia
Un closure es un bloque de código autónomo que puede almacenarse y pasarse de un lugar a otro. Sintaxis completa:
let double = { (n: Int) -> Int in
return n * 2
}Los closures pueden almacenarse en variables y pasarse como argumentos (por ejemplo, a map). Swift infiere los tipos en el contexto, lo que permite una sintaxis abreviada:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // $0 es el primer argumentoPruébalo tú mismo
let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: definir tres clausuras (Int) -> Int y mapear nums a través de cada una
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 palabras8Closures
Conceptos básicos de ClosuresTrailing ClosuresCaptura de valoresRetorno de ClosuresOrden superior personalizadoResumen - Pipeline Builder