Utilizando los Atajos de iOS como funciones

Hace un par de semanas mi padre me pidió le ayudase a crear un atajo de iOS para poder exportar una serie de datos de una aplicación de música a un archivo de texto, ya que esta app requería de una subscripción para poder exportar sus datos.

En principio el problema era simple, la app cuenta con un atajo que permite obtener todas las canciones de tu colección (como una lista de objetos), por lo que había simplemente que obtener por cada album su artista y su título para exportarlos a otra aplicación. Aquí es cuando viene el problema, con una iteración normal (que en los Atajos es un objeto «Repetir con cada item en…«) no podíamos obtener todos los datos del album, solo nos dejaba sacar el título, el artista, etc.

O eso pensaba, hasta que me dí cuenta de que la única limitación era realmente la falta de otro atajo que me permitiese iterar sobre más de una lista (a partir de aquí, me referiré de igual manera a una función como un atajo).

Me puse manos a la obra, saqué mi libreta y me puse a escribir un pseudocódigo que me sirviese para poder separar los elementos de la colección en varias listas y luego unirlas… y entonces caí en la cuenta, estaba implementando una función de orden superior, concretamente el Zip (o zipWith en Haskel).

Bueno, no exactamente, ya que pasar una función como parámetro o como elemento a devolver por otra, no es posible en los atajos de Apple. Lo que sí es posible es duplicar atajos o pasar la salida de uno a la entrada de otro… pero esto no era suficiente, lo que yo necesitaba hacer era implementar un Zip covencional de la programción funcional, que recibe ambas listas como entrada junto con un selector, (tal y como se lo he enseñado a mis alumnos de TPP este año en C#).

Aunque no podamos definir el comportamiento del selector podemos acercarnos a una solución con una iteración a través de dos listas haciendo uso de la función «Repetir con cada ítem en…» y con «Obtener ítem del índice – Índidce de la repetición de…«.

El resultado es algo muy similar a la implementación clásica con enumeradores que utiliza C# con el moveNext, y aunque no nos permite pasar el comportamiento de la función como parámetro, siempre podemos clonarla y definir dentro de ella la operación a realizar.

¿Y cómo le vamos a pasar las dos listas a esta nueva función, si los atajos de apple solo permiten recibir una única entrada? Muy sencillo, con una única entrada que contenga nuestras dos listas, es decir un diccionario1. En este caso, he definido las dos listas a dos elementos «First» y «Second«, pero si quisiésemos podríamos pasar tantas como necesitásemos combinar.

Quiero aprovechar también para presumir de otros atajos que he creado y que me han resultado útiles, en concreto unos que creé en su momento y que, mediante peticiones web, permiten comprobar cuanto tiempo falta para algunas de las líneas de bus de urbano Oviedo2.

1 Definición de los diccionarios para obtener las listas a combinar.z
2 Ejecución del comando «¿Cuánto falta para el bus?«

Deja una respuesta