Home » Cursos » Swift Avanzado (II): Map, reduce y filter, funciones avanzadas para arrays
Swift Avanzado (II) Map Filter Reduce

Swift Avanzado (II): Map, reduce y filter, funciones avanzadas para arrays

Seguimos con el curso avanzado de Swift, después del éxito de la primera lección que trataba sobre las funciones currificadas o parcializadas. En está lección vamos a aprender a manejar con ejemplos tres importantes funciones de alto nivel, asociadas a la programación funcional y el uso de closures.

Estas son: map, reduce y filter, 3 métodos de alto nivel que pertenecen por sistema a la implementación de colecciones en Swift, especialmente útiles en los array. Permiten transformar todo el contenido del mismo, reducir todos sus valores a uno solo en función de un criterio común o filtrar sus elementos en base a unos criterios. Y todo ello con una sola instrucción.

Pero antes de empezar queremos dejar muy claro que estas tres funciones, que forman parte de la programación funcional igualmente, tienen muchas y muy variadas posibilidades y aquí solo vamos a pasar por encima para que veáis casos concretos que pueden ayudaros a empezar a usarlas. A partir de ahí sois vosotros los que tenéis que encontrar el mejor uso pero desde luego son sumamente prácticas una vez las entendemos.

Map, transformando

La función map lo que hace es ejecutar una función en todos los elementos de un array, donde construimos dicha función de transformación en base a la referencia genérica de los valores. Es decir, dentro de la llamada a map, la referencia $0 representa el dato en sí dentro nuestro array. Por ejemplo, veamos un array de números:

¿Cómo sumaríamos 5 a cada uno de los números? La respuesta inmediata que daría cualquiera sería que haciendo una iteración con un for in de la siguiente forma:

¿Pero cómo sería con map? Haciendo un closure que recogiera el valor $0 que representa a cada uno de los elementos del array que recorremos y sumándoles cinco. Además, la propia función se encarga de actualizar cada valor porque su propio concepto es de transformación: aplicar una función a cada elemento de un array actualizando su valor con el resultado, incluso el propio tipo de dato si fuera necesario.

La función map también es muy útil cuando queremos invocar un mismo método o función común a todo un número de elementos. Por ejemplo, imaginemos que tenemos un array repleto de objetos SKSpriteNode a los que hay que hacerles un addChild u otro que tiene infinidad de elementos de un interfaz en UIKit y queremos hacerles el correspondiente addSubview. Pues sería algo tan simple como esto:

Existen infinidad de ejemplos más, como por ejemplo: en la vista donde incluimos todos nuestros elementos de interfaz existe siempre un array llamado subviews que nos permite acceder a todas aquellas que forman parte de la misma. Sabiendo esto, podríamos ejecutar un setNeedsDisplay que redibuje toda la interfaz tras poner una serie de restricciones (o constraints) de manera programada a nuestra interfaz.

También podemos usarlo para transformar un array en otro tipo diferente de una manera muy simple, como por ejemplo coger un array de números y crear uno nuevo que sean cadenas con dicho número.

Filter, filtrando

Con la función filter tenemos la opción de seleccionar de un array determinados elementos en función de una condición y obtener como resultado solamente aquellos que cumpla dicha condición. Esto es aplicable a cualquier tipo de condición cuyo resultado sea true o false, lo que nos abre posibilidades a multitud de opciones.

Imaginemos que tenemos una interfaz en pantalla y queremos crear un array con solo los botones que hay en pantalla y no cualquier otro objeto.

Ya tenemos en un array todos aquellos elementos que den por correcta la condición de si son del tipo UIButton. O por ejemplo, un array de números donde queremos guardar solo aquellos menores de 10.

Así de simple. Solo hemos poner una condición a evaluar en cada uno de los elementos del array: si el resultado es positivo, pasará el filtro y si no, se descartará.

Reduce, reduciendo o acumulando

¿Has usado alguna vez el Excel o el Numbers? Pues reduce es el sumatorio o acumulador de los valores de una columna que todos conocemos. A partir de una operación básica y un valor inicial, reduce el total de elementos de un array a su mínima expresión.

Si tenemos un array de números la forma de sumarlos en una variable es tan simple como:

El primer parámetro es el valor de inicio de nuestro acumulador y el parámetro combine indica con un closure qué operación ha de realizar a cada uno de los elementos del array para que el resultado de este se sume al acumulado de dicho valor de inicio.

Una multiplicación sucesiva, empezando desde 1 y no desde 0 para evitar que el resultado no se incremente, nos permitiría obtener el acumulado de multiplicar cada valor hasta obtener el total en una sola cantidad.

Conclusión

Esto son solo pequeños ejemplos que nos permiten conocer la capacidad de tratamiento que podemos conseguir con estas funciones, propias de la programación funcional heredada de Haskell, y que tienen una capacidad de ahorrarnos trabajo y facilitarnos la vida, bastante importante.

Como siempre, probad, experimentad y sacad el máximo provecho. Mientras, nos vemos en el próximo artículo y Good Apple Coding.

Acerca de Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Otras recomendaciones

Lecciones Prototipos (I): UITableView

Lecciones por prototipos (I): Vistas de tabla (UITableView)

Primera lección por prototipos, un nuevo e innovador contenido. A veces, lo normal es que nos perdamos sin terminar de entender qué es o cómo funcionan los componentes que forman parte de una app o un juego. Para este caso hemos creado las lecciones por prototipos. Una exploración básica de conceptos esenciales a través de prototipos en Playground que podemos probar con Swift Playgrounds en el iPad o con Xcode 8. En esta primera lección abordamos las UITableView (vistas de tabla). Un elemento esencial en la mayoría de apps de iOS que muchas veces no es entendido desde su base y por lo tanto, provoca un mal uso de las mismas.