SALE ENDS TODAY: Save 50% on all Swift books and bundles! >>

Clausura (Closures)

Hasta ahora ya haz conocido a los enteros, cadenas, dobles, flotantes, boleanos, arreglo, diccionario, estructura y clases; sin embargo, hay otro tipo de dato que es utilizado extensamente en Swift, y se llama clausura o bien en inglés closure. Estas son un tipo complicado, pero debido a que son muy poderosas y expresivas se utilizan de forma generalizada en Cocoa Touch, así que no llegarás muy lejos sin entenderlas.

Una clausura puede ser pensado como una variable que contiene código. Al igual que un entero puede contener un 0 o 500, una clausura contiene líneas de código de Swift. Son diferentes a una función porque las clausuras son un tipo de datos por derecho propio: puedes pasar una clausura como parámetro o guardarla como un propiedad. Las clasuras también capturan el ambiente en el que fueron creadas, lo que significa que toman una copia de los valores que son usados dentro de ellas.

Nunca necesitas diseñar tus propias clausuras, así que no tengas miedo si encuentras lo siguiente bastante complicado. Sin embargo, tanto en Cocoa como en Cocoa Touch necesitarás escribir clausuras para satisfacer sus necesidades, así que al menos necesitas entender como funcionan. Primero Veamos un ejemplo de Cocoa Touch:

let vw = UIView()

UIView.animate(withDuration: 0.5, animations: {
    vw.alpha = 0
})

UIView es un tipo de dato parte de UIKit que representa el más básico contenedor de interfaz gráfica de usuario. No te preocupes si no sabes su funcionamiento por ahora, todo lo que importa es que el componente básico de interfaz de usuario. UIView tiene un método llamado animate() y te permite cambiar como se ve tu interfaz usando una animación - tu describes que es lo que cambiará y cuántos segundos durará, y Cocoa Touch hace el resto.

El método animate() lleva dos parámetros en ese código: el número de segundos de duración y la clausura conteniendo el código que se ejecutará como parte de la animación. Yo especifique medio segundo como el primer parámetro, y para el segundo le pedí UIKit que ajuste el alpha de la vista (la opacidad) a 0, lo que significa "completamente transparente".

Este método necesita una clasura porque UIKit tiene que realizar todo tipo de trabajos para prepararse para el comienzo de la animación, entonces lo que sucede es que UIKit toma una copia del codigo adentro las llaves (eso es nuestra clausura), lo guarda, realizar todo el trabajo de preparación, finalmente ejecuta nuestro código cuando este listo. Esto no sería posible si únicamente fueramos a ejecutar nuestro código directamente.

El código de arriba también nos muestra como las clausuras capturan el ambiente: Yo declare la constante vw afuera de la clausura, después la use adentro de ésta. Swift detecta esto, y hace que los datos también esten disponibles adentro de nuestra clausura.

El sistema de Swift para la captura automatica de ambiente de una clausura es muy útil, aunque de vez en cuando puede hacerte tropezar: si un objeto A guarda una clausura como una propiedad y ésta propiedad también hace referencia al objeto A, tendrás algo que se llama ciclo de referencia fuerte y tendrás usuarios infelices. Esto es substancialmente un tema más avanzado de lo que necesitas saber ahora, así que no te preocupes mucho por esto aún.

Trailing closures

Debido a que las clausuras son utilizadas frecuentemente, Swift puede aplicar un poco de azucar sintáctica para poder leer código con mayor fácilidad. Esta regla es: si el último parámetro de un método recibe una clausura, puedes eliminar el último parámetro y en su lugar proporcionarlo como un bloque de código adentro de llaves. Por ejemplo, podríamos convertir el código previo en el siguiente:

let vw = UIView()

UIView.animate(withDuration: 0.5) {
    vw.alpha = 0
}

Esto hace tu código más corto y fácil de leer, así que esta forma de sintaxis - conocida como sintaxis de clausura al final - is prefrerida.

SPONSORED Instabug helps you identify and resolve severe crashes quickly. You can retrace in-app events and know exactly which line of code caused the crash along with environment details, network logs, repro steps, and the session profiler. Ask more questions or keep users up-to-date with in-app replies straight from your dashboard. Instabug takes data privacy seriously, so no one sees your data but you! See more detailed features comparison and try Instabug's crash reporting SDK for free.

Save 50% on all books and bundles

The biggest ever Hacking with Swift sale is now on, letting you save 50% on all books and bundles. Learn something new with Swift and enjoy great savings while the sale lasts!

Click here to save 50% in our Black Friday sale!

BUY OUR BOOKS
Buy Pro Swift Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift (Vapor Edition) Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Server-Side Swift (Kitura Edition) Buy Beyond Code

Was this page useful? Let us know!