Menu
Coddy logo textTech

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))                  // 10

Swift 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 argumento

Los closures son valores, puedes almacenarlos en variables, devolverlos desde funciones y pasarlos como argumentos. Esa es la razón por la cual map funciona.

challenge icon

Desafío

Fácil

Lee dos líneas de entrada:

  1. Un entero x
  2. Una lista de enteros separados por comas

Define tres clausuras (closures), cada una de tipo (Int) -> Int:

  • addX suma x a su argumento
  • square devuelve el cuadrado del argumento
  • negate devuelve 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,-3

Hoja 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 argumento

Prué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
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