Escribir bloques de finalización con cierres en Swift

Incluso después de tener un buen manejo del concepto de bloques, todavía tenía que buscar su sintaxis cada vez que quería escribir cualquier cosa menos el bloque más simple (gracias fuckingblocksyntax.com). La versión de bloques de Swift, conocida como cierres, adopta un enfoque mucho más limpio y natural de la sintaxis. Así que sin más preámbulos, es hora de aprender cierres de la forma en que mi padre me enseñó: escribiendo un bloque de finalización.

La API de animación de UIView es una de las áreas más comunes en las que los desarrolladores de iOS usan bloques. Antes de escribir a ciegas tu propio método, intenta usar una de las muestras de código de Apple para familiarizarte con la sintaxis. A continuación se muestra un ejemplo de Objective-C, y luego el mismo código escrito en Swift:

Objective C:

Swift:

Para consternación de conejos y desarrolladores miopes, los carets ( ^ ) no se encuentran (todavía) en Swift. Descansa en paz viejo amigo, has sido reemplazado por la palabra clave in. Usa la palabra clave in una vez que hayas terminado de declarar los parámetros y los valores devueltos para tu cierre. Esto tendrá más sentido si te muestro qué autocompletar rellenó una vez que supo qué método quería:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?)

Centrándose en esta sintaxis, queda claro cómo escribir correctamente los parámetros y los valores de retorno de un cierre:

{(parameters) -> (return type) in expression statements}

En el ejemplo de código Swift anterior, los dos cierres de animación devolvían void, por lo que podríamos eliminar la sintaxis de tipo de retorno. Es por eso que solo ves el ( ) para los parámetros. Observe que incluso si no hay parámetros, como en el primer cierre, todavía necesita esos empty ( ) antes de la palabra clave in. Son necesarios. En negrita para que lo recuerdes.

Bien, ahora intentemos escribir nuestro propio método Swift con un cierre de finalización. En el repositorio de Github vinculado al final de esta publicación, he estado trabajando en una aplicación cliente de Github en Swift con un equipo de Compañeros de Código. En este proyecto tenemos un controlador de red que maneja todas las llamadas de red asíncronas a la API de Github.

Escribamos un método que recupera una lista de usuarios de una consulta de búsqueda en el cliente. Este método necesitará un cierre de finalización para que el Controlador de vista solicitante sepa cuándo finaliza la llamada a la red y proporcione una variedad de modelos de usuario para rellenar nuestra vista de colección.

Así es como se vería la firma de la función:

func searchUsersWithSearchTerm(searchTerm: String, completionClosure: (users :User) ->()) 

Tenemos dos parámetros aquí: un tipo de cadena llamado searchTerm y nuestro cierre de finalización. ¿Observa la sintaxis en el parámetro de cierre? Primero está el nombre de nuestro cierre, que es como lo llamaremos más adelante en el método, luego el parámetro (matriz de usuarios), seguido de nuestro valor de retorno (vacío). A continuación se muestra una aproximación de cómo se ve el cuerpo de este método:

 //setup a NSMutableRequest with the correct API URL and parameters //setup a dataTask on our NSURLSession instance //once our datatask has successfully retrieved the data we wanted, and we have parsed through it to create an array of User Models, we call our completion closure like this: var users : User = //Parse the JSON data into Users completionClosure(users: users)

Llamar a nuestro cierre de finalización en Swift es casi de la misma manera que llamamos a nuestro bloque de finalización en Objective-C. Se llama como cualquier otra función, y nos aseguramos de pasar un array como parámetro, ya que así es como lo definimos en nuestra firma de función. Deliberadamente omití todo el código de red para mantener esta publicación lo más corta posible, pero siéntete libre de revisar el repositorio de Github si estás interesado en ver cómo funciona. En un futuro próximo, planeamos publicar una entrada de blog en la red de Swift.

Finalmente, echemos un vistazo a cómo llamaríamos a este método desde nuestro SearchUsersViewController:

Una cosa más que quiero que noten es cómo llamé a addOperationWithBlock() en nuestro mainQueue(). Si un cierre es el último parámetro de la firma de una función, puede usar una sintaxis especial para hacerlo aún más limpio. Esto se conoce como cierre final. Los cierres finales se escriben directamente después de los () de una llamada a una función. A continuación se muestra una llamada a una función, primero con un cierre regular, luego con un cierre final.

Es una diferencia sutil, y ambas formas funcionan. Solo recuerde que tiene que ser el último parámetro de la función para usar la sintaxis de cierre final.

Ahora debería conocer la sintaxis básica de los cierres en Swift. Para obtener información de nivel más avanzado sobre cierres, consulte el Lenguaje de programación Swift en iBooks. Tiene una subsección completa. Y aquí está el enlace al proyecto cliente de github.

También hay una contraparte rápida para fuckingblocksyntax.com llamaste, lo adivinaste, maldito impuesto de síntesis de seguros.com que definitivamente vale la pena agregar a su barra de marcadores a medida que aprende Swift.

Buen día.

¿Listo para convertirse en un desarrollador profesional? ¡Póngase en contacto para averiguar cómo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.