Aprende Swift 3

Closures dentro de Swift

¡Prueba gratis durante 10 días

nuestros 1240 cursos !

Prueba gratis Mostrar modalidades de suscripción
Los closures son algo muy importante dentro del lenguaje, porque nos permiten hacer llamadas a secciones de código que otro programador puede definir al utilizar nuestras funciones. Es como darle el control a otra función dentro de nuestra función.

Transcripción

Ya llegamos a la parte más divertida de Swift. Son los "closures". Si vienes de JavaScript o de algún otro lenguaje dinámico esto te va a dar mucho sentido. ¿Por qué? Porque los "closures" son bloques de código que puedes enviar entre funciones, hacer referencias o simplemente definir para usarlos después y estas funciones son realmente muy sencillas. En Java también se llaman como funciones anónimas. Lo más importante es que en Swift andan por todos lados. Primero vamos a ver la sintaxis. La sintaxis es muy sencilla. Primero vas a necesitar identificar que necesitas estas llaves "{ }". Voy a quitar esto para que no te confundas. Básicamente es, necesitas llaves, después abres y cierras paréntesis y dentro de los paréntesis vas a colocar los parámetros. En algunos casos, la mayoría te va a pedir que no nombres los parámetros que sean parámetros anónimos en donde tú puedes solo identificar el tipo y, lo importante, es el orden que tengas el orden adecuado de cada uno de estos parámetros. Después de los paréntesis como si fuera cualquier función vas a tener "-" y el tipo de retorno. El tipo de retorno va a ser el objetivo de este "closure". El "closure" puede regresar valores o no eso no importa pero si quieres regresar valores tienes que identificar de qué tipo va a ser ese valor. Después vas a colocar la palabra "in" y después del "in" vienen todas tus líneas de código. Voy a comentar esto porque nada más es para referencia. Vamos a ver un ejemplo muy rápido. ¿Cómo puedo enviar un "closure"? De esta manera. Aquí tengo una colección del 1 al 5 es un arreglo, no hay nada especial son puros enteros. Lo importante es que la colección tiene un método llamado "Filter". "Filter" es un método que regresa el mismo arreglo pero filtrado dependiendo de si pasa o no la condición. Si pasa la condición, entonces lo regresa en el nuevo arreglo y si no, simplemente lo quita. Pero "Filter" para poder hacer esa evaluación de una manera más óptima nos expone un API en donde recibe un "closure". Si te fijas, aquí está el "closure" en donde abre y cierra llaves abre paréntesis, le da el valor del parámetro que es "n". "n" es de tipo entero, ¿cómo lo sé? Lo sé porque viene dentro del "closure". Y regresa un booleano. Este booleano es el que va a indicar si lo va a filtrar o no. Si lo filtra, lo va a filtrar porque regresa "true". Si regresa "true" lo va a agregar al arreglo nuevo y si regresa "false" lo va a quitar. ¿Qué es lo que estoy haciendo? Simplemente "n" % 2 que sea diferente de "0" para que me regrese todos los impares o nones. Si te fijas, aquí ya nos está regresando el resultado. Esto se ejecuta "5 veces" pero el resultado de este filtro es "1, 3 y 5", un arreglo ya filtrado. Esta sintaxis no es la única que puedes identificar dentro de los "closures" también puede ser "filter, espacio", le quitas los paréntesis y le estás pasando el bloque al final. Algo muy importante es que si tienes más de una línea de código tienes que ser explícito con la palabra "return" para identificar en dónde vas a regresar el valor de este "closure". Si te fijas, aquí arriba no lo necesito porque es la única línea de código pero aquí abajo sí la voy a necesitar. También podemos recibir un "closure". Por ejemplo, ¿qué pasa si quiero definir una función en donde reciba el "closure" y sepa qué hacer con él? Muy sencillo, aquí voy a tener una función que se llama "makeTea" y voy a recibir el "closure" con un parámetro [nombrado]. Este "closure" lo defino con un tipo si ya conocías "Objective-C" te vas a dar cuenta que en realidad estamos haciendo referencia a los tipos que va a recibir en parámetro y a regresar. En este caso, este "closure" va a recibir un arreglo de cadenas y va a regresar una cadena y, a su vez, toda la función de "makeTea" va a regresar una cadena al final. ¿Qué es lo que hace? Primero voy a imprimir esta pequeña gota después voy a imprimir la palabra "Teapot" y después voy a elegir dentro del "closure" le voy a arrojar este arreglo de opciones y dependiendo del sabor que elijan voy a escribir un mensaje, ya sea en la consola y lo voy a regresar. ¿Cómo lo voy a implementar? Muy sencillo, "makeTea", si recuerdas aquí nos iban a pasar una lista de sabores y voy a elegir qué sabor quiero, quiero el de índice [1] o quiero el de índice [0] aquí puedes ver la diferencia. Esto va a ser muy útil si quieres estarle pasando a alguien más un conjunto de valores que todavía no sabes qué va a hacer con él para decidir. En este caso podría poner un algoritmo de decisión en cuanto a las preferencias de un usuario pero, si te fijas, todo mi flujo va a seguir exactamente igual solamente voy a exponer la decisión del sabor del té a otro programador. Por último quiero hablar acerca del verdadero valor de los "closures" que es recibirlos y poderlos enviar a otro lado. Por ejemplo voy a irme a la parte final y voy a pegar este ejemplo que tengo aquí. Este ejemplo en realidad lo que hace es hacer un "closure", recibir la fruta e indicarle cuántas veces se va a imprimir esa fruta. ¿Cómo funciona? Muy sencillo. Esta función va a regresar un "closure" y este "closure" lo que va a hacer es que ya va a traer definido cuál es la fruta que va a querer imprimir. Para que te puedas dar una idea "appleMaker" en realidad es un "closure" de "makeClosure" con la fruta manzana. Por otro lado, aquí ya quiero saber cuántas manzanas por ejemplo le puedo decir que sean (5) pero lo más importante es que le puedo decir que sean (10) Tengo que cambiar la referencia de "apples +10" y listo, ya tengo la misma referencia a la fruta pero con una cantidad diferente de veces que se va a repetir y puedo hacer lo mismo con "makeClosure" pero con otra fruta. Este es el verdadero valor de los "closures". Puedo crear funciones, guardar la referencia a ellos y utilizarlas las veces que necesite. Esto es muy importante a la hora de estar definiendo "closures". También es muy importante que tengas muy claro cómo va a ser la navegación de estos "closures" y a quién le vas a exponer qué responsabilidades. Diviértete con los "closures" pero ten muchísimo cuidado qué es lo que expones. Sobre todo si vas a estar haciendo una navegación muy complicada te sugiero que dentro de la documentación de tus funciones indiques qué es lo que debe hacer cada uno de estos "closures" para que no tengas problemas en tus aplicaciones ni con tu equipo.

Aprende Swift 3

Descubre Swift 3, la versión más actual del lenguaje de Apple; conoce todas sus novedades y aprende el lenguaje de código abierto desde cero para desarrollar tus aplicaciones.

3:14 horas (31 Videos)
Actualmente no hay comentarios.
 

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.