Historia de la pregunta: La sintaxis de cierre final es una construcción sintáctica de Swift introducida para mejorar la legibilidad del código al utilizar bloques de cierre al final de las funciones. Facilita el trabajo con cierres grandes y anidados, especialmente en un estilo funcional y declarativo.
Problema: La declaración estándar de cierres con múltiples paréntesis complica la estructura visual del código, haciéndolo menos comprensible:
UIView.animate(withDuration: 0.3, animations: { ... })
A medida que el tamaño del cierre crece, este código se vuelve menos legible.
Solución: Swift permite sacar el último argumento-función fuera de los paréntesis:
UIView.animate(withDuration: 0.3) { // bloque de animación }
Si hay dos o más cierres, la sintaxis de cierre final solo es posible para el último parámetro de cierre, los demás deben indicarse entre paréntesis.
Características clave:
¿Se puede aplicar la sintaxis de cierre final si el cierre no es el último parámetro de la función?
No, solo el último parámetro puede ser presentado como cierre final. Si se necesitan más de un cierre, solo el último puede ser sacado después de los paréntesis, los demás se pasan dentro de los paréntesis.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
¿Se pueden omitir los paréntesis al llamar a un método con un único argumento-cierre?
Sí, si la función toma un único argumento que es un cierre, los paréntesis se pueden omitir por completo:
func doWork(action: () -> Void) doWork { print("Tarea") }
¿Se puede usar el cierre final para funciones con parámetros variádicos después del cierre?
No, la sintaxis de cierre final solo se aplica si el cierre es el último argumento. Después de él no puede haber ni parámetros variádicos ni otros. La siguiente línea provocará un error:
func test(x: () -> Void, y: Int...) // ... llamada imposible con cierre final
La llamada con dos parámetros de cierre está estructurada sin la sintaxis final, lo que hace que el método ocupe 5 pantallas en vertical, aumentando la complejidad de comprensión.
Pros:
Contras:
En la implementación de UICollectionViewCompositionalLayout se usa un cierre final: el bloque de diseño se lee fácilmente, la estructura representa visualmente la jerarquía de componentes de diseño.
Pros:
Contras: