En Swift, un closure es un bloque de código que puede ser pasado y ejecutado en cualquier parte de tu programa. Los closures son similares a las funciones, pero con la flexibilidad de capturar y almacenar variables y constantes del contexto en el que son definidos. Son ampliamente utilizados en Swift para la programación funcional, como cuando se usan en callbacks, filtros y mapeos.
La sintaxis de un closure es compacta y puede parecer compleja al principio. A continuación se muestra la estructura básica:
{ (parametros) -> TipoDeRetorno in
// Cuerpo del closure
}
let saludoClosure = { (nombre: String) -> String in
return "Hola, \(nombre)"
}
let mensaje = saludoClosure("Ana")
print(mensaje)
En este ejemplo:
saludoClosure
toma un parámetro String
y devuelve un String
.
"Ana"
.
Salida:
Hola, Ana
Los closures son comúnmente utilizados como parámetros en funciones, lo que permite personalizar el comportamiento de una función.
func realizarOperacion(a: Int, b: Int, operacion: (Int, Int) -> Int) -> Int {
return operacion(a, b)
}
let suma = realizarOperacion(a: 5, b: 3, operacion: { (x, y) -> Int in
return x + y
})
print(suma)
Aquí:
realizarOperacion
recibe un closure que toma dos enteros y devuelve un entero.
Salida:
8
Swift permite simplificar la sintaxis de los closures eliminando partes que pueden ser inferidas, como los tipos de parámetros y el valor de retorno.
let sumaAbreviada = realizarOperacion(a: 5, b: 3, operacion: { x, y in
x + y
})
print(sumaAbreviada)
return
porque el closure solo contiene una expresión.
Swift también permite usar nombres de parámetros abreviados como $0
, $1
, etc.
let multiplicacion = realizarOperacion(a: 4, b: 2, operacion: { $0 * $1 })
print(multiplicacion)
$0
representa el primer parámetro, y $1
el segundo.
Salida:
8
Si un closure es el último o único parámetro de una función, Swift permite colocarlo fuera de los paréntesis, lo que se conoce como "Trailing Closure".
let resultado = realizarOperacion(a: 10, b: 5) { $0 - $1 }
print(resultado)
Aquí, el closure se coloca fuera de los paréntesis de la función, haciéndolo más legible.
Salida:
5
Los closures en Swift pueden "capturar" constantes y variables del contexto en el que fueron creados. Esto significa que pueden acceder a esos valores y modificarlos si es necesario, incluso después de que el contexto original haya desaparecido.
func crearContador() -> () -> Int {
var contador = 0
let incrementar = {
contador += 1
return contador
}
return incrementar
}
let contadorClosure = crearContador()
print(contadorClosure()) // 1
print(contadorClosure()) // 2
print(contadorClosure()) // 3
En este ejemplo, el closure incrementar
captura la variable contador
, que sigue existiendo y se modifica cada vez que el closure se ejecuta.
Los closures en Swift son una herramienta poderosa y flexible que te permite escribir código más conciso y reutilizable. Desde usar closures como callbacks hasta capturar variables del entorno, son fundamentales en el manejo de operaciones asíncronas y funcionales.
Para más información sobre closures en Swift, consulta la documentación oficial de Swift.
Jorge García
Fullstack developer