{"id":1326,"date":"2026-05-09T15:26:22","date_gmt":"2026-05-09T13:26:22","guid":{"rendered":"https:\/\/dylan.carvajal.es\/?p=1326"},"modified":"2026-05-10T22:23:02","modified_gmt":"2026-05-10T20:23:02","slug":"utilizando-los-atajos-de-ios-como-funciones","status":"publish","type":"post","link":"https:\/\/dylan.carvajal.es\/?p=1326","title":{"rendered":"Utilizando los Atajos de iOS como funciones"},"content":{"rendered":"\n<div class=\"wp-block-group alignwide is-horizontal is-content-justification-left is-layout-flex wp-container-core-group-is-layout-68ef7a61 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-dd225191 wp-block-group-is-layout-flex\">\n<p>Hace un par de semanas mi padre me pidi\u00f3 le ayudase a crear un atajo de iOS para poder exportar una serie de datos de una aplicaci\u00f3n de m\u00fasica a un archivo de texto, ya que esta app requer\u00eda de una subscripci\u00f3n para poder exportar sus datos.<\/p>\n\n\n\n<p>En principio el problema era simple, la app cuenta con un atajo que permite obtener todas las canciones de tu colecci\u00f3n (como una lista de objetos), por lo que hab\u00eda simplemente que obtener por cada album su artista y su t\u00edtulo para exportarlos a otra aplicaci\u00f3n. Aqu\u00ed es cuando viene el problema, con una iteraci\u00f3n normal (que en los Atajos es un objeto \u00ab<em>Repetir con cada item en&#8230;<\/em>\u00ab) no pod\u00edamos obtener todos los datos del album, solo nos dejaba sacar el t\u00edtulo, el artista, etc.<\/p>\n\n\n\n<p>O eso pensaba, hasta que me d\u00ed cuenta de que la \u00fanica limitaci\u00f3n era realmente la falta de <strong>otro atajo que me permitiese iterar sobre m\u00e1s de una lista<\/strong> (a partir de aqu\u00ed, me referir\u00e9 de igual manera a una <em>funci\u00f3n <\/em>como un <em>atajo<\/em>).<\/p>\n\n\n\n<p>Me puse manos a la obra, saqu\u00e9 mi libreta y me puse a escribir un pseudoc\u00f3digo que me sirviese para poder separar los elementos de la colecci\u00f3n en varias listas y luego unirlas&#8230; y entonces ca\u00ed en la cuenta, estaba implementando una funci\u00f3n de orden superior, concretamente el <a href=\"https:\/\/en.wikipedia.org\/wiki\/Zipping_(computer_science)\">Zip <\/a>(o zipWith en Haskel).<\/p>\n\n\n\n<p>Bueno, no exactamente, ya que pasar una funci\u00f3n como par\u00e1metro o como elemento a devolver por otra, no es posible en los atajos de Apple. Lo que s\u00ed es posible es duplicar atajos o pasar la salida de uno a la entrada de otro&#8230; pero esto no era suficiente, lo que yo necesitaba hacer era implementar un Zip covencional de la programci\u00f3n funcional, que recibe ambas listas como entrada junto con <strong>un selector<\/strong>, (tal y como se lo he ense\u00f1ado a mis alumnos de TPP este a\u00f1o en C#).<\/p>\n\n\n\n<p>Aunque no podamos definir el comportamiento del selector podemos acercarnos a una soluci\u00f3n con una iteraci\u00f3n a trav\u00e9s de dos listas haciendo uso de la funci\u00f3n \u00ab<em>Repetir con cada \u00edtem en&#8230;<\/em>\u00bb y con \u00ab<em>Obtener \u00edtem del \u00edndice &#8211; \u00cdndidce de la repetici\u00f3n de&#8230;<\/em>\u00ab.<\/p>\n\n\n\n<p>El resultado es algo muy similar a la implementaci\u00f3n cl\u00e1sica con enumeradores que utiliza C# con el <em>moveNext<\/em>, y aunque no nos permite pasar el comportamiento de la funci\u00f3n como par\u00e1metro, siempre podemos clonarla y definir dentro de ella la operaci\u00f3n a realizar.<\/p>\n\n\n\n<p>\u00bfY c\u00f3mo le vamos a pasar las dos listas a esta nueva funci\u00f3n, si los atajos de apple solo permiten recibir una \u00fanica entrada? Muy sencillo, con una \u00fanica entrada que contenga nuestras dos listas, es decir un diccionario<sup>1<\/sup>. En este caso, he definido las dos listas a dos elementos \u00ab<em>First<\/em>\u00bb y \u00ab<em>Second<\/em>\u00ab, pero si quisi\u00e9semos podr\u00edamos pasar tantas como necesit\u00e1semos combinar.<\/p>\n\n\n\n<p class=\"has-text-align-left\">Quiero aprovechar tambi\u00e9n para presumir de otros atajos que he creado y que me han resultado \u00fatiles, en concreto unos que cre\u00e9 en su momento y que, mediante peticiones web, permiten comprobar cuanto tiempo falta para algunas de las l\u00edneas de bus de urbano Oviedo<sup>2<\/sup>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.icloud.com\/shortcuts\/b6b4efc193f94122b3d46c56b25f4a3f\">Atajo: Zip<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.icloud.com\/shortcuts\/dbac79e87d0541238bd163f407282d55\">Atajo: \u00bfCu\u00e1nto falta para el bus? &#8211; CTA Oviedo<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.icloud.com\/shortcuts\/1b6bd6ce0ab2477fbc4371834e366268\">Subatajo: getTimeBus<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.icloud.com\/shortcuts\/c51bd1181b784e81adf59691d2c4351b\">Subatajo: getTextBus<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-horizontal is-content-justification-left is-layout-flex wp-container-core-group-is-layout-d00c0c7a wp-block-group-is-layout-flex\" style=\"min-height:0px\">\n<figure class=\"wp-block-image alignright size-full is-resized has-custom-border is-style-default\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"1170\" height=\"2532\" src=\"https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026.jpg\" alt=\"\" class=\"wp-image-1337\" style=\"border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;aspect-ratio:0.4619158641662443;object-fit:cover;width:249px\" srcset=\"https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026.jpg 1170w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026-139x300.jpg 139w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026-473x1024.jpg 473w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026-768x1662.jpg 768w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026-710x1536.jpg 710w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1026-946x2048.jpg 946w\" sizes=\"auto, (max-width: 1170px) 100vw, 1170px\" \/><figcaption class=\"wp-element-caption\"><sup>1<\/sup> Definici\u00f3n de los diccionarios para obtener las listas a combinar.z<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image alignright size-full is-resized has-custom-border wp-container-content-9cfa9a5a\"><a href=\"https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1170\" height=\"2027\" src=\"https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024.jpg\" alt=\"\" class=\"wp-image-1336\" style=\"border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;aspect-ratio:0.5771543086172345;object-fit:cover;width:250px\" srcset=\"https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024.jpg 1170w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024-173x300.jpg 173w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024-591x1024.jpg 591w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024-768x1331.jpg 768w, https:\/\/dylan.carvajal.es\/wp-content\/uploads\/2026\/05\/IMG_1024-887x1536.jpg 887w\" sizes=\"auto, (max-width: 1170px) 100vw, 1170px\" \/><\/a><figcaption class=\"wp-element-caption\"><sup>2<\/sup> Ejecuci\u00f3n del comando \u00ab<em>\u00bfCu\u00e1nto falta para el bus?<\/em>\u00ab<\/figcaption><\/figure>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Hace un par de semanas mi padre me pidi\u00f3 le ayudase a crear un atajo de iOS para poder exportar una serie de datos de una aplicaci\u00f3n de m\u00fasica a un archivo de texto, ya que esta app requer\u00eda de una subscripci\u00f3n para poder exportar sus datos. En principio el problema era simple, la app [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","footnotes":""},"categories":[127],"tags":[84],"class_list":["post-1326","post","type-post","status-publish","format-standard","hentry","category-hobbies","tag-apple"],"_links":{"self":[{"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=\/wp\/v2\/posts\/1326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1326"}],"version-history":[{"count":11,"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=\/wp\/v2\/posts\/1326\/revisions"}],"predecessor-version":[{"id":1388,"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=\/wp\/v2\/posts\/1326\/revisions\/1388"}],"wp:attachment":[{"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dylan.carvajal.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}