<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Swift Pills</title><link>https://www.swiftpills.dev/</link><description>Recent content on Swift Pills</description><generator>Hugo</generator><language>es-ES</language><lastBuildDate>Wed, 03 Jun 2026 08:00:00 +0100</lastBuildDate><atom:link href="https://www.swiftpills.dev/index.xml" rel="self" type="application/rss+xml"/><image><url>https://www.swiftpills.dev/images/logo.jpeg</url><title>Swift Pills</title><link>https://www.swiftpills.dev/</link></image><item><title>Estado en SwiftUI: fuentes de verdad, bindings y errores que aparecen cuando la vista empieza a crecer</title><link>https://www.swiftpills.dev/posts/estado-en-swiftui-fuentes-de-verdad-observation-y-errores-comunes/</link><pubDate>Wed, 03 Jun 2026 08:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/estado-en-swiftui-fuentes-de-verdad-observation-y-errores-comunes/</guid><description>&lt;p&gt;🧭 En &lt;code&gt;SwiftUI&lt;/code&gt;, casi todos los problemas de con el estado empiezan igual: una pantalla pequeña funciona perfectamente, se añaden dos o tres interacciones más, aparece una vista hija, luego otra, y de pronto algo deja de actualizarse, se reinicia cuando no debería o se comparte entre vistas de forma inesperada. No suele ser un fallo de &lt;code&gt;SwiftUI&lt;/code&gt;, sino una señal de que la fuente de verdad no está colocada en el sitio correcto.&lt;/p&gt;</description></item><item><title>Background App Refresh en SwiftUI: actualiza datos sin abrir la app</title><link>https://www.swiftpills.dev/posts/background-app-refresh-swiftui/</link><pubDate>Tue, 02 Jun 2026 06:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/background-app-refresh-swiftui/</guid><description>&lt;p&gt;🔄 Las tareas en segundo plano son una de esas capacidades de iOS que parecen sencillas hasta que intentas implementar alguna de ellas. La idea es muy tentadora: permitir que una app actualice datos, limpie cachés o prepare contenido aunque el usuario no la tenga en primer plano. En SwiftUI, además, Apple ofrece una integración bastante cómoda mediante el modificador &lt;code&gt;.backgroundTask&lt;/code&gt;, pero eso no significa que el sistema vaya a ejecutar nuestro código cuando queramos ni durante todo el tiempo que nos gustaría.&lt;/p&gt;</description></item><item><title>Sheets en SwiftUI que se ajustan automáticamente a su contenido</title><link>https://www.swiftpills.dev/posts/sheets-swiftui-ajustadas-al-contenido/</link><pubDate>Sun, 31 May 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/sheets-swiftui-ajustadas-al-contenido/</guid><description>&lt;p&gt;📐 Las &lt;code&gt;sheet&lt;/code&gt; de &lt;code&gt;SwiftUI&lt;/code&gt; funcionan muy bien cuando aceptas los tamaños que el sistema propone. El problema aparece cuando tu interfaz no encaja en niguno de esos tamaños. Una vista pequeña queda flotando dentro de un &lt;em&gt;sheet&lt;/em&gt; demasiado alto. Una vista algo más grande puede quedar cortada. Y una pantalla que solo necesita presentar una confirmación breve termina ocupando gran parte de la pantalla sin necesidad.&lt;/p&gt;
&lt;p&gt;Desde iOS 16, SwiftUI permite controlar la altura de una hoja con &lt;code&gt;presentationDetents&lt;/code&gt;, usando valores como &lt;code&gt;.medium&lt;/code&gt;, &lt;code&gt;.large&lt;/code&gt;, &lt;code&gt;.height(...)&lt;/code&gt; o &lt;code&gt;.fraction(...)&lt;/code&gt;. Es una mejora enorme frente al comportamiento inicial de los &lt;em&gt;sheets&lt;/em&gt;, pero sigue teniendo una limitación importante: no existe un &lt;em&gt;detent&lt;/em&gt; nativo que diga simplemente “mide el contenido y usa esa altura”.&lt;/p&gt;</description></item><item><title>Formatear valores en SwiftUI: menos String, más intención</title><link>https://www.swiftpills.dev/posts/formatear-valores-swiftui-text-textfield/</link><pubDate>Sat, 23 May 2026 09:00:00 +0200</pubDate><guid>https://www.swiftpills.dev/posts/formatear-valores-swiftui-text-textfield/</guid><description>&lt;p&gt;🧩 En SwiftUI es muy tentador convertirlo todo a &lt;code&gt;String&lt;/code&gt; antes de pintarlo en pantalla. Un número se interpola, una fecha se pasa por un &lt;code&gt;DateFormatter&lt;/code&gt;, una cantidad se concatena con un símbolo de moneda y un porcentaje se multiplica a mano. Funciona, sí, pero también es una forma rápida de llenar la interfaz de pequeños futuros problemas: separadores decimales incorrectos, indicador de divisa mal colocados, fechas que resultan poco naturales o campos de texto que aceptan valores imposibles.&lt;/p&gt;</description></item><item><title>ARC y zombies en Swift</title><link>https://www.swiftpills.dev/posts/arc-de-zombie-objects-a-side-tables/</link><pubDate>Sun, 17 May 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/arc-de-zombie-objects-a-side-tables/</guid><description>&lt;p&gt;🧠 ARC (Automatic Reference Counting) lleva con nosotros desde el primer día en Swift, pero la mayoría de desarrolladores solo conoce su capa exterior: los objetos se retienen, se liberan y se destruyen cuando el contador llega a cero. Lo que muy pocos saben es que el modelo interno ha cambiado de forma significativa desde las primeras versiones del lenguaje. Esos cambios no son detalles de implementación irrelevantes: explican por qué ciertas decisiones de diseño tienen un coste, y por qué el &lt;em&gt;runtime&lt;/em&gt; se comporta de una manera u otra en situaciones límite.&lt;/p&gt;</description></item><item><title>`.refreshable` en SwiftUI: por qué tu tarea se cancela sola (y cómo evitarlo)</title><link>https://www.swiftpills.dev/posts/refreshable-task-cancellation-en-swiftui/</link><pubDate>Thu, 14 May 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/refreshable-task-cancellation-en-swiftui/</guid><description>&lt;p&gt;🔄 &lt;code&gt;.refreshable&lt;/code&gt; es uno de esos modificadores de SwiftUI que parece trivial hasta que algo falla de forma inexplicable. Lo añades a una lista, le pasas tu función &lt;code&gt;async&lt;/code&gt;, y todo funciona en el simulador. Pero en producción, o simplemente bajo condiciones ligeramente distintas, la carga se interrumpe a la mitad, el indicador de refresco desaparece antes de tiempo, o una petición de red lanza un error. El origen del problema casi nunca está donde lo buscas.&lt;/p&gt;</description></item><item><title>onChange() en SwiftUI: reacciona a cambios con precisión</title><link>https://www.swiftpills.dev/posts/onchange-en-swiftui-guia-completa/</link><pubDate>Wed, 13 May 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/onchange-en-swiftui-guia-completa/</guid><description>&lt;p&gt;🔔 El modificador &lt;code&gt;onChange()&lt;/code&gt; es la herramienta de SwiftUI para ejecutar código en respuesta a cambios de valor. Observa una propiedad concreta y dispara un &lt;em&gt;closure&lt;/em&gt; cada vez que su contenido varía. Para determinar si el valor ha cambiado, el tipo observado debe conformar &lt;code&gt;Equatable&lt;/code&gt;, lo que permite a SwiftUI realizar la comparación de forma automática y eficiente. Desde su introducción en iOS 14 hasta las revisiones de iOS 17, la API ha madurado considerablemente, y conocer sus variantes actuales marca la diferencia entre código predecible y comportamientos inesperados.&lt;/p&gt;</description></item><item><title>Enums en Swift: mucho más que una lista de constantes</title><link>https://www.swiftpills.dev/posts/enums-en-swift/</link><pubDate>Sat, 09 May 2026 09:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/enums-en-swift/</guid><description>&lt;p&gt;🃏 Si vienes de Objective-C, Java o cualquier lenguaje donde un &lt;code&gt;enum&lt;/code&gt; es básicamente un entero con nombre bonito, Swift va a sorprenderte. Los enums de Swift son tipos de datos muy completos: pueden transportar información propia en cada caso, tener métodos y propiedades computadas, conformar protocolos y modelar estructuras recursivas. Son una de las herramientas más expresivas del lenguaje, y no usarlas en todo su potencial es dejar sobre la mesa una ventaja real de diseño.&lt;/p&gt;</description></item><item><title>Parámetros inout en Swift: mutación controlada y diseño de API</title><link>https://www.swiftpills.dev/posts/inout-en-swift/</link><pubDate>Thu, 07 May 2026 07:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/inout-en-swift/</guid><description>&lt;p&gt;🔒 Swift está diseñado para favorecer la inmutabilidad por defecto. Los parámetros de una función son constantes, lo que evita efectos secundarios accidentales y simplifica el razonamiento sobre el código. Pero hay situaciones en las que necesitas que una función modifique directamente el valor que recibe, no que devuelva una copia transformada. Para eso existe &lt;code&gt;inout&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;🔄 El mecanismo interno de &lt;code&gt;inout&lt;/code&gt; no es paso por referencia al estilo de C o C++, aunque lo parezca. Swift implementa un modelo llamado &lt;em&gt;copy-in copy-out&lt;/em&gt;: al llamar a la función, el valor se copia en un almacenamiento local; la función opera sobre esa copia; y al retornar, el valor modificado se escribe de vuelta en la variable original. El compilador puede optimizar este proceso usando directamente la dirección de memoria original cuando es seguro hacerlo, pero el contrato semántico sigue siendo el de copia.&lt;/p&gt;</description></item><item><title>Propiedades lazy en Swift: qué son, cómo funcionan y por qué fallan en SwiftUI</title><link>https://www.swiftpills.dev/posts/lazy-properties-en-swift-y-sus-trampas-en-swiftui/</link><pubDate>Sat, 25 Apr 2026 20:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/lazy-properties-en-swift-y-sus-trampas-en-swiftui/</guid><description>&lt;p&gt;💤 Una propiedad &lt;code&gt;lazy&lt;/code&gt; en Swift es una propiedad almacenada cuyo valor no se calcula hasta que se accede a ella por primera vez. A diferencia de las propiedades almacenadas habituales, que se inicializan en el momento en que se crea la instancia, las propiedades &lt;code&gt;lazy&lt;/code&gt; difieren ese trabajo hasta que realmente se necesita. La sintaxis es directa: basta con anteponer la palabra clave &lt;code&gt;lazy&lt;/code&gt; a una declaración de &lt;code&gt;var&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>associatedtype en Swift: el mecanismo que hace posible la abstracción genérica en protocolos</title><link>https://www.swiftpills.dev/posts/associatedtype-en-swift/</link><pubDate>Mon, 20 Apr 2026 10:00:00 +0200</pubDate><guid>https://www.swiftpills.dev/posts/associatedtype-en-swift/</guid><description>&lt;p&gt;🧩 &lt;code&gt;associatedtype&lt;/code&gt; es una de esas características del sistema de tipos de Swift que pasan desapercibidas al principio, pero que están detrás de casi todo lo que usamos a diario. El protocolo &lt;code&gt;Sequence&lt;/code&gt;, la colección &lt;code&gt;Array&lt;/code&gt;, el propio protocolo &lt;code&gt;View&lt;/code&gt; de SwiftUI: todos ellos dependen de esta misma pieza. Entender cómo funciona no es solo un ejercicio teórico; es comprender el contrato que Swift establece entre la abstracción y la seguridad de tipos en tiempo de compilación.&lt;/p&gt;</description></item><item><title>El ciclo de vida de las vistas en SwiftUI: cuándo se dispara onAppear de verdad</title><link>https://www.swiftpills.dev/posts/swiftui-ciclo-de-vida-onappear/</link><pubDate>Thu, 16 Apr 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swiftui-ciclo-de-vida-onappear/</guid><description>&lt;p&gt;🎭 &lt;code&gt;onAppear&lt;/code&gt; es uno de esos modificadores que parece trivial hasta que deja de comportarse como esperas. En configuraciones sencillas funciona exactamente como esperas: la vista aparece, &lt;code&gt;onAppear&lt;/code&gt; se dispara; desaparece, &lt;code&gt;onDisappear&lt;/code&gt; hace lo propio. El problema llega cuando añades esa lógica en un &lt;code&gt;TabView&lt;/code&gt;, en una pila de navegación o en una lista de miles de filas, y de repente el comportamiento cambia de forma que no cuadra con el modelo mental que tenías.&lt;/p&gt;</description></item><item><title>Stack vs Heap en Swift: más allá de la regla que todos repiten</title><link>https://www.swiftpills.dev/posts/stack-vs-heap-en-swift/</link><pubDate>Tue, 14 Apr 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/stack-vs-heap-en-swift/</guid><description>&lt;p&gt;🧩 Hay una regla que circula sin parar en entrevistas técnicas de iOS: los structs van al stack y las clases van al heap. Es fácil de memorizar, suena convincente y, en la mayoría de los casos sencillos, parece funcionar. El problema es que no describe cómo Swift gestiona la memoria en la práctica. En cuanto hablamos de código real, la regla se rompe. Entender el modelo de verdad requiere empezar por otro sitio: la semántica, no el almacenamiento.&lt;/p&gt;</description></item><item><title>Mutex en Swift: protege el estado mutable compartido sin renunciar al rendimiento</title><link>https://www.swiftpills.dev/posts/mutex-en-swift-estado-mutable-compartido/</link><pubDate>Sat, 11 Apr 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/mutex-en-swift-estado-mutable-compartido/</guid><description>&lt;p&gt;🔒 La concurrencia en Swift ha madurado mucho con Swift 6 y el modelo de actores, pero hay situaciones donde los actores no son la herramienta correcta, ni siquiera suficente. El tipo &lt;code&gt;Mutex&lt;/code&gt; ha sido introducido en el framework &lt;code&gt;Synchronization&lt;/code&gt; junto a iOS 18, y cubre ese espacio: protección síncrona, de bajo nivel y alto rendimiento sobre estado mutable compartido.&lt;/p&gt;
&lt;p&gt;⚙️ Un &lt;code&gt;Mutex&lt;/code&gt; (del inglés &lt;em&gt;mutual exclusion&lt;/em&gt;) garantiza que solo un hilo puede acceder al valor protegido en un instante determinado. A diferencia de los actores, que suspenden la tarea con &lt;code&gt;await&lt;/code&gt; y dejan que el planificador de Swift Concurrency tome el control, un &lt;code&gt;Mutex&lt;/code&gt; &lt;strong&gt;bloquea el hilo&lt;/strong&gt; hasta que el recurso queda libre. Esta diferencia es fundamental: bloqueante contra suspensivo. No hay una opción universalmente mejor; hay una opción correcta para cada escenario.&lt;/p&gt;</description></item><item><title>ARC en Swift: lo que todo desarrollador debería saber</title><link>https://www.swiftpills.dev/posts/arc-en-swift/</link><pubDate>Tue, 07 Apr 2026 10:00:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/arc-en-swift/</guid><description>&lt;p&gt;🧠 ARC (Automatic Reference Counting) es uno de esos temas que todos los desarrolladores Swift dicen conocer, pero pocos entienden de verdad. La superficie es simple: los objetos se liberan cuando su contador de referencias llega a cero. Lo interesante empieza cuando profundizas en cómo el compilador y el runtime colaboran para que eso ocurra de forma eficiente.&lt;/p&gt;
&lt;p&gt;⚙️ ARC no es solo un mecanismo en tiempo de compilación, aunque esa sea la simplificación más común. El compilador de Swift analiza tu código e inserta las operaciones de gestión de memoria. Esas operaciones se ejecutan después en tiempo de ejecución. ARC, por tanto, vive entre el análisis estático y la ejecución dinámica. Eso es precisamente lo que lo hace predecible y rápido sin necesitar un recolector de basura al estilo de Java o Go.&lt;/p&gt;</description></item><item><title>Swift en Android es oficial</title><link>https://www.swiftpills.dev/posts/swift-en-android-es-oficial/</link><pubDate>Sun, 04 Jan 2026 13:21:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swift-en-android-es-oficial/</guid><description>&lt;p&gt;🚀 El SDK oficial de Swift para Android ya está aquí en las previews diarias de Swift 6.3. Lo que empezó como parches aportados por la comunidad en 2015, se ha convertido en apps de producción descargadas millones de veces. Desde Spark hasta Flowkey, empresas llevan años compartiendo código Swift entre iOS y Android.&lt;/p&gt;
&lt;p&gt;🔧 Swift compila directamente a código nativo en Android usando LLVM, igual que en iOS. Esto significa rendimiento comparable a C/C++ con el Android NDK, pero con las garantías de seguridad y ergonomía de Swift. Tu código incluye el runtime de Swift con &lt;code&gt;Foundation&lt;/code&gt; y Dispatch listos para funcionar.&lt;/p&gt;</description></item><item><title>Desarrollar para watchOS no es iOS en miniatura: son mundos diferentes</title><link>https://www.swiftpills.dev/posts/desarrollar-para-watchos-no-es-ios-en-miniatura-son-mundos-diferentes/</link><pubDate>Sat, 03 Jan 2026 12:39:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/desarrollar-para-watchos-no-es-ios-en-miniatura-son-mundos-diferentes/</guid><description>&lt;p&gt;⚠️ El desarrollo para Apple Watch es el gran olvidado del ecosistema Apple. Aunque millones de personas llevan uno en la muñeca, pocos desarrolladores se especializan en crear apps realmente profesionales para &lt;code&gt;watchOS&lt;/code&gt;. La razón es clara: está lleno de peculiaridades no documentadas, comportamientos inesperados y limitaciones que solo descubres cuando tienes apps con millones de usuarios.&lt;/p&gt;
&lt;p&gt;🔄 El primer gran problema es la sincronización de versiones entre dispositivos. Si tu iPhone tiene iOS 26.1 y el Apple Watch tiene &lt;code&gt;watchOS&lt;/code&gt; 26.0, prepárate para lidiar con apps que no se instalan, datos de &lt;code&gt;HealthKit&lt;/code&gt; que desaparecen, anillos de actividad que no se rellenan y comunicación por WCSession que simplemente falla. Esta incompatibilidad afecta directamente a la experiencia del usuario desde el momento de la instalación.&lt;/p&gt;</description></item><item><title>¿Por qué @State en SwiftUI no se actualiza desde la vista padre? Este error confunde hasta a desarrolladores avanzados</title><link>https://www.swiftpills.dev/posts/por-que-state-en-swiftui-no-se-actualiza-desde-la-vista-padre-este-error-confunde-hasta-a-desarrolladores-avanzados/</link><pubDate>Fri, 02 Jan 2026 11:12:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/por-que-state-en-swiftui-no-se-actualiza-desde-la-vista-padre-este-error-confunde-hasta-a-desarrolladores-avanzados/</guid><description>&lt;p&gt;🔐 &lt;code&gt;@State&lt;/code&gt; representa el estado privado interno de una vista en &lt;code&gt;SwiftUI&lt;/code&gt;. Su valor inicial solo se aplica cuando la vista establece su identidad por primera vez en la jerarquía. Después, &lt;code&gt;SwiftUI&lt;/code&gt; ignora completamente cualquier nuevo valor que intentes pasarle.&lt;/p&gt;
&lt;p&gt;🧬 La clave está en entender la identidad de las vistas. &lt;code&gt;SwiftUI&lt;/code&gt; adopta una estrategia de inicialización única: cuando la vista se carga por primera vez, crea el almacenamiento interno (State&lt;!-- raw HTML omitted --&gt;). En actualizaciones posteriores, aunque el padre llame de nuevo al init de la hija con nuevos valores, &lt;code&gt;SwiftUI&lt;/code&gt; detecta que ya existe almacenamiento para esa identidad y lo reutiliza, descartando los parámetros nuevos.&lt;/p&gt;</description></item><item><title>¿Integras modelos de IA en tus apps de iOS 26 pero no sabes si su rendimiento es óptimo?</title><link>https://www.swiftpills.dev/posts/integras-modelos-de-ia-en-tus-apps-de-ios-26-pero-no-sabes-si-su-rendimiento-es-optimo/</link><pubDate>Thu, 01 Jan 2026 14:23:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/integras-modelos-de-ia-en-tus-apps-de-ios-26-pero-no-sabes-si-su-rendimiento-es-optimo/</guid><description>&lt;p&gt;🎯 Con iOS 26, Apple democratizó el acceso a modelos de lenguaje en el dispositivo mediante el framework ``Foundation&lt;code&gt; Models&lt;/code&gt;. Este modelo de 3 mil millones de parámetros ejecuta inferencia de IA completamente local, protegiendo la privacidad del usuario mientras ofrece capacidades avanzadas de generación de texto, extracción de información y llamadas a herramientas.&lt;/p&gt;
&lt;p&gt;📊 Xcode 26 incorpora una plantilla en Instruments para inspeccionar ``Foundation&lt;code&gt; Models&lt;/code&gt; que nos permite visualizar métricas críticas: tiempo de carga de recursos, procesamiento de prompts, conteo de tokens de entrada y salida, y latencia total de respuesta. Esto es fundamental porque el modelo tiene un límite estricto de 4096 tokens, y excederlo causa fallos en las sesiones.&lt;/p&gt;</description></item><item><title>Cerrar apps en iOS para ahorrar batería: el mito que debes dejar de creer</title><link>https://www.swiftpills.dev/posts/cerrar-apps-en-ios-para-ahorrar-bateria-el-mito-que-debes-dejar-de-creer/</link><pubDate>Wed, 31 Dec 2025 10:20:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/cerrar-apps-en-ios-para-ahorrar-bateria-el-mito-que-debes-dejar-de-creer/</guid><description>&lt;p&gt;🔄 Cuántas veces has visto a alguien cerrando compulsivamente todas las apps del multitarea para &amp;ldquo;ahorrar batería&amp;rdquo;. Incluso Craig Federighi, vicepresidente de ingeniería de software de Apple, lo dejó claro: &amp;ldquo;no y no&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;📱 El ciclo de vida de una app iOS tiene cinco estados principales:&lt;/p&gt;
&lt;p&gt;Sin ejecución&lt;/p&gt;
&lt;p&gt;Inactiva&lt;/p&gt;
&lt;p&gt;Activa&lt;/p&gt;
&lt;p&gt;Segundo plano&lt;/p&gt;
&lt;p&gt;Suspendida&lt;/p&gt;
&lt;p&gt;Cuando sales de una aplicación, sin forzar el cierre, iOS la suspende automáticamente tras unos segundos.&lt;/p&gt;
&lt;p&gt;🧠 Las apps suspendidas permanecen en memoria pero no ejecutan código ni consumen CPU. El sistema las mantiene ahí listas para reanudarse instantáneamente. Esto es mucho más eficiente que forzar su cierre y obligarlas a arrancar desde cero.&lt;/p&gt;</description></item><item><title>¿Sabías que puedes permitir a los usuarios responder directamente desde una notificación sin abrir tu app?</title><link>https://www.swiftpills.dev/posts/sabias-que-puedes-permitir-a-los-usuarios-responder-directamente-desde-una-notificacion-sin-abrir-tu-app/</link><pubDate>Tue, 30 Dec 2025 12:14:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/sabias-que-puedes-permitir-a-los-usuarios-responder-directamente-desde-una-notificacion-sin-abrir-tu-app/</guid><description>&lt;p&gt;📝 Las acciones de entrada de texto en notificaciones iOS son una de las funciones más poderosas del framework UserNotifications. Permiten que los usuarios escriban respuestas, proporcionen información o envíen mensajes cortos sin interrumpir su flujo de trabajo.&lt;/p&gt;
&lt;p&gt;🎯 La clase UNTextInputNotificationAction representa estas acciones especiales. Aquí un ejemplo creando una acción para que un usuario añada una tarea rápida:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; addTaskAction = UNTextInputNotificationAction(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; identifier: &lt;span style="color:#e6db74"&gt;&amp;#34;addQuickTask&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: &lt;span style="color:#e6db74"&gt;&amp;#34;Nueva tarea&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textInputButtonTitle: &lt;span style="color:#e6db74"&gt;&amp;#34;Guardar&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textInputPlaceholder: &lt;span style="color:#e6db74"&gt;&amp;#34;Escribe tu tarea...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;🏗️ Estas acciones deben agruparse en categorías. Puedes combinar acciones de entrada de texto con botones normales:&lt;/p&gt;</description></item><item><title>¿Tu app se cierra inesperadamente y Xcode Organizer no te da suficiente información? MetricKit es la solución</title><link>https://www.swiftpills.dev/posts/tu-app-se-cierra-inesperadamente-y-xcode-organizer-no-te-da-suficiente-informacion-metrickit-es-la-solucion/</link><pubDate>Mon, 29 Dec 2025 11:07:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/tu-app-se-cierra-inesperadamente-y-xcode-organizer-no-te-da-suficiente-informacion-metrickit-es-la-solucion/</guid><description>&lt;p&gt;🔍 Xcode Organizer nos proporciona métricas esenciales como crashes, consumo de batería, tiempos de arranque y uso de memoria. Sin embargo, se queda corto cuando necesitamos diagnosticar la terminación abrupta de la app o profundizar en problemas complejos de rendimiento que afectan a usuarios reales.&lt;/p&gt;
&lt;p&gt;⚡ &lt;code&gt;MetricKit&lt;/code&gt; es el framework que Apple introdujo en iOS 13 para llenar este vacío. Nos permite recopilar diagnósticos detallados a nivel del sistema operativo sobre cómo se comporta nuestra app en dispositivos reales. Recibe informes agregados cada 24 horas con datos de rendimiento, batería y diagnósticos de la jornada anterior.&lt;/p&gt;</description></item><item><title>¿Autoreleasepool en Swift? ¿Un vestigio del pasado o una herramienta esencial?</title><link>https://www.swiftpills.dev/posts/autoreleasepool-en-swift-un-vestigio-del-pasado-o-una-herramienta-esencial/</link><pubDate>Sun, 28 Dec 2025 14:38:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/autoreleasepool-en-swift-un-vestigio-del-pasado-o-una-herramienta-esencial/</guid><description>&lt;p&gt;🧬 Aunque ARC gestiona la memoria automáticamente en Swift, autoreleasepool sigue siendo relevante. Este superviviente de la era MRC (Manual Reference Counting) es un contenedor temporal que retiene objetos enviados a través de un mensaje autorelease hasta que el pool se vacía, momento en el que todos reciben un release.&lt;/p&gt;
&lt;p&gt;⚙️ Muchas APIs del sistema siguen escritas en Objective-C, y el puente entre Swift y Objective-C genera objetos autoreleased. Frameworks como &lt;code&gt;Core Image&lt;/code&gt;, &lt;code&gt;AVFoundation&lt;/code&gt; y &lt;code&gt;PDFKit&lt;/code&gt; devuelven valores autoreleased por razones de rendimiento, por lo que autoreleasepool sigue siendo necesario.&lt;/p&gt;</description></item><item><title>¿Sigues usando SF Symbols estáticos cuando podrías darles vida con animaciones nativas?</title><link>https://www.swiftpills.dev/posts/sigues-usando-sf-symbols-estaticos-cuando-podrias-darles-vida-con-animaciones-nativas/</link><pubDate>Sat, 27 Dec 2025 10:35:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/sigues-usando-sf-symbols-estaticos-cuando-podrias-darles-vida-con-animaciones-nativas/</guid><description>&lt;p&gt;🎨 SF Symbols no son solo íconos: son gráficos vectoriales diseñados específicamente para integrarse con el sistema tipográfico de Apple. Desde iOS 17, &lt;code&gt;SwiftUI&lt;/code&gt; incluye efectos de animación nativos que transforman estos símbolos en elementos dinámicos y expresivos sin necesidad de frameworks externos.&lt;/p&gt;
&lt;p&gt;💫 Las animaciones disponibles son sorprendentemente variadas: pulse hace que el símbolo simule un latido como un corazón, bounce añade un rebote, wiggle crea un movimiento de lado a lado, rotate lo gira suavemente, y breathe simula una pulsación sutil (como la respiración). Cada una transmite un significado diferente y mejora la comunicación visual.&lt;/p&gt;</description></item><item><title>Sombra interior en SF Symbols: el efecto que desconocías para tus iconos en SwiftUI</title><link>https://www.swiftpills.dev/posts/sombra-interior-en-sf-symbols-el-efecto-que-desconocias-para-tus-iconos-en-swiftui/</link><pubDate>Fri, 26 Dec 2025 12:09:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/sombra-interior-en-sf-symbols-el-efecto-que-desconocias-para-tus-iconos-en-swiftui/</guid><description>&lt;p&gt;🎨 &lt;code&gt;SwiftUI&lt;/code&gt; ofrece docenas de APIs para personalizar iconos con SF Symbols, pero existe una técnica poco conocida que transforma radicalmente la apariencia de tus símbolos: las sombras interiores aplicadas directamente al estilo de primer plano.&lt;/p&gt;
&lt;p&gt;💎 Esta técnica permite crear iconos que parecen tallados o hundidos en su fondo, generando un efecto de profundidad inversa. En lugar de que el símbolo sobresalga de la superficie, aparece como si estuviera recortado dentro de ella.&lt;/p&gt;</description></item><item><title>Swift 6.2 cambia las reglas del juego en concurrencia: ¿será finalmente sencillo para todos?</title><link>https://www.swiftpills.dev/posts/swift-6-2-cambia-las-reglas-del-juego-en-concurrencia-sera-finalmente-sencillo-para-todos/</link><pubDate>Thu, 25 Dec 2025 14:53:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swift-6-2-cambia-las-reglas-del-juego-en-concurrencia-sera-finalmente-sencillo-para-todos/</guid><description>&lt;p&gt;🎯 Swift 6 prometía seguridad ante condiciones de carrera, pero llegó con una barrera enorme: cientos de errores del compilador que aparecían al activar la concurrencia estricta. Muchos desarrolladores activaban Swift 6, veían el caos de advertencias y volvían atrás de inmediato.&lt;/p&gt;
&lt;p&gt;🔄 Swift 6.2 introduce la Approachable Concurrency, un cambio fundamental en cómo el lenguaje trata la concurrencia. En lugar de obligarte a entender actores, el protocolo &lt;code&gt;Sendable&lt;/code&gt; y aislamiento global desde el primer momento, ahora el compilador asume que tu código empieza siendo de un solo hilo.&lt;/p&gt;</description></item><item><title>Deslizar desde cualquier punto de la pantalla para volver atrás en UIKit: una experiencia nativa mejorada</title><link>https://www.swiftpills.dev/posts/deslizar-desde-cualquier-punto-de-la-pantalla-para-volver-atras-en-uikit-una-experiencia-nativa-mejorada/</link><pubDate>Wed, 24 Dec 2025 14:38:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/deslizar-desde-cualquier-punto-de-la-pantalla-para-volver-atras-en-uikit-una-experiencia-nativa-mejorada/</guid><description>&lt;p&gt;🎯 El gesto de deslizar desde el borde izquierdo para retroceder es uno de los patrones de navegación más intuitivos de iOS. Sin embargo, por defecto en &lt;code&gt;UIKit&lt;/code&gt;, este gesto solo funciona desde un área muy estrecha del borde izquierdo de la pantalla.&lt;/p&gt;
&lt;p&gt;📏 Apple limita el área táctil del gesto de retroceso a aproximadamente 44 puntos desde el borde izquierdo. Esta restricción puede resultar frustrante para los usuarios, especialmente en dispositivos más grandes donde alcanzar el borde puede ser incómodo.&lt;/p&gt;</description></item><item><title>¿Probando Universal Links en desarrollo y la CDN de Apple te frena? El modo alternativo es tu salvavidas.</title><link>https://www.swiftpills.dev/posts/probando-universal-links-en-desarrollo-y-la-cdn-de-apple-te-frena-el-modo-alternativo-es-tu-salvavidas/</link><pubDate>Tue, 23 Dec 2025 12:24:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/probando-universal-links-en-desarrollo-y-la-cdn-de-apple-te-frena-el-modo-alternativo-es-tu-salvavidas/</guid><description>&lt;p&gt;🚦 Desde iOS 14, el sistema ya no descarga el archivo AASA directamente de tu servidor. En su lugar, usa una CDN gestionada por Apple que cachea el contenido. Esta CDN puede tardar entre 1 y 6 horas en actualizar su caché, lo que complica el desarrollo cuando necesitas probar cambios rápidamente en tu archivo AASA.&lt;/p&gt;
&lt;p&gt;🔒 Peor aún: si tu servidor de desarrollo está detrás de una VPN o en una red privada, la CDN simplemente no puede acceder a él y tus pruebas quedan bloqueadas. Apple ofrece una solución elegante: los modos alternativos. Añadiendo ?mode=developer al dominio en los entitlements, iOS omite la CDN y conecta directo con tu servidor.&lt;/p&gt;</description></item><item><title>Transferable: el protocolo que revoluciona copiar, compartir y arrastrar datos en SwiftUI.</title><link>https://www.swiftpills.dev/posts/transferable-el-protocolo-que-revoluciona-copiar-compartir-y-arrastrar-datos-en-swiftui/</link><pubDate>Mon, 22 Dec 2025 10:50:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/transferable-el-protocolo-que-revoluciona-copiar-compartir-y-arrastrar-datos-en-swiftui/</guid><description>&lt;p&gt;🔄 Antes de iOS 16, implementar drag-and-drop o compartir datos personalizados requería trabajar con NSItemProvider, serialización manual y mucho código repetitivo. Todo eso cambió con Transferable.&lt;/p&gt;
&lt;p&gt;✨ El protocolo Transferable del framework Core Transferable permite describir de forma declarativa cómo tus tipos personalizados se serializan y deserializan para transferencias de datos. Lo mejor: funciona automáticamente con APIs de &lt;code&gt;SwiftUI&lt;/code&gt; como ShareLink, PasteButton, draggable() y dropDestination().&lt;/p&gt;
&lt;p&gt;🎯 Para adoptar Transferable solo necesitas definir una propiedad estática: transferRepresentation. Esta representación le dice al sistema cómo convertir tu tipo en datos transferibles y cómo reconstruirlo después. Apple proporciona tres formas principales de representación según tus necesidades.&lt;/p&gt;</description></item><item><title>Swift cierra 2025 como un lenguaje verdaderamente universal: del servidor al microcontrolador</title><link>https://www.swiftpills.dev/posts/swift-cierra-2025-como-un-lenguaje-verdaderamente-universal-del-servidor-al-microcontrolador/</link><pubDate>Sun, 21 Dec 2025 13:01:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swift-cierra-2025-como-un-lenguaje-verdaderamente-universal-del-servidor-al-microcontrolador/</guid><description>&lt;p&gt;🎯 Diciembre marca el final de un año histórico para Swift como proyecto de código abierto. Desde su nacimiento hace una década, Swift ha evolucionado de ser un lenguaje exclusivo para plataformas Apple a convertirse en una solución multiplataforma que abarca más de 70 repositorios y cientos de contribuidores semanales.🚀 Swift 6.2 representa un salto cualitativo con concurrencia más accesible mediante valores predeterminados que siguen la filosofía de aprendizaje progresivo: las funciones avanzadas están disponibles cuando las necesitas, pero no estorban cuando no las usas.💻 El soporte oficial para WebAssembly abre nuevas fronteras. Gracias a la comunidad SwiftWasm y la integración con WASI (WebAssembly System Interface), ahora puedes compilar código Swift para ejecutarse en navegadores, entornos serverless y cualquier runtime compatible. El runtime WasmKit está incluido directamente en los toolchains de Swift 6.2.📱 Android recibe soporte oficial con mejoras increméntales y versiones diarias del SDK. Los desarrolladores pueden crear aplicaciones nativas para Android usando Swift, con interoperabilidad con Java mediante swift-java, que genera automáticamente los wrappers necesarios. Esto permite compartir lógica de negocio entre iOS y Android sin sacrificar rendimiento.⚡ Embedded Swift evoluciona rápidamente hacia casos prácticos. Swift 6.3 trae mejoras significativas: soporte completo para APIs de String, tipos any para protocolos con restricciones de clase, y los nuevos tipos InlineArray y Span. Esto hace posible ejecutar Swift en microcontroladores ARM y RISC-V con binarios extremadamente compactos.🌐 Windows, BSD y la nube también forman parte del ecosistema. FreeBSD 14.3 cuenta con soporte preliminar, Amazon Linux integra Swift oficialmente, y AWS Lambda Runtime se traslada a AWS Labs como solución soportada por el proveedor. La extensión de VS Code está verificada y distribuida oficialmente.🏗️ El stack tecnológico se consolida: Swift Configuration 1.0 unifica el manejo de configuración, gRPC Swift potencia servicios cloud de alto rendimiento, y paquetes como MLX llevan machine learning a Apple Silicon con APIs nativas de Swift.👨‍💻 Swift demuestra que seguridad de memoria, rendimiento nativo y expresividad moderna pueden coexistir en un solo lenguaje. ¿Ya estás explorando Swift más allá de las plataformas Apple?&lt;/p&gt;</description></item><item><title>Listas interactivas en macOS con SwiftUI: selección, doble clic y menús contextuales unificados</title><link>https://www.swiftpills.dev/posts/listas-interactivas-en-macos-con-swiftui-seleccion-doble-clic-y-menus-contextuales-unificados/</link><pubDate>Sat, 20 Dec 2025 13:16:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/listas-interactivas-en-macos-con-swiftui-seleccion-doble-clic-y-menus-contextuales-unificados/</guid><description>&lt;p&gt;🖱️ En &lt;code&gt;macOS&lt;/code&gt;, los usuarios esperan un comportamiento específico en las listas: un clic selecciona, doble clic ejecuta una acción principal y clic derecho muestra opciones.&lt;/p&gt;
&lt;p&gt;📋 Para habilitar este patrón necesitas dos elementos clave: un inicializador de List que acepte el parámetro selection con binding, y el modificador contextMenu(forSelectionType:menu:primaryAction:). Primero define un tipo Identifiable y la propiedad de selección:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DocumentItem&lt;/span&gt;: Identifiable {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; id = UUID()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; title: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; type: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@State &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; selectionID: DocumentItem.ID? = &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;🎯 El modificador contextMenu tiene tres partes esenciales: forSelectionType define el tipo de identificador, menu construye el menú contextual con botones de acción, y primaryAction define la acción del doble clic. Implementa la lista con el modificador completo:&lt;/p&gt;</description></item><item><title>¿Crees que @Query en SwiftData es estático? Te sorprenderá lo dinámico que puede ser</title><link>https://www.swiftpills.dev/posts/crees-que-query-en-swiftdata-es-estatico-te-sorprendera-lo-dinamico-que-puede-ser/</link><pubDate>Fri, 19 Dec 2025 14:38:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/crees-que-query-en-swiftdata-es-estatico-te-sorprendera-lo-dinamico-que-puede-ser/</guid><description>&lt;p&gt;🔍 La macro @Query de &lt;code&gt;SwiftData&lt;/code&gt; nos permite consultar datos persistentes de forma declarativa, pero muchos desarrolladores no saben que puede volverse completamente dinámico cuando lo necesitamos.&lt;/p&gt;
&lt;p&gt;⚡ El problema surge cuando intentas usar &lt;code&gt;@State&lt;/code&gt; directamente en un predicado: &lt;code&gt;SwiftData&lt;/code&gt; no puede acceder a propiedades de instancia durante la inicialización de @Query. La solución está en la arquitectura de vistas.&lt;/p&gt;
&lt;p&gt;🏗️ El patrón correcto implica separar responsabilidades: una vista contenedora maneja el estado dinámico (filtros, búsquedas, ordenación) y una subvista ejecuta el @Query recibiendo parámetros por inyección de dependencias.&lt;/p&gt;</description></item><item><title>¿Inicializas correctamente tus clases @Observable en SwiftUI? Algnos errores pueden romper tu app</title><link>https://www.swiftpills.dev/posts/inicializas-correctamente-tus-clases-observable-en-swiftui-algnos-errores-pueden-romper-tu-app/</link><pubDate>Thu, 18 Dec 2025 10:25:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/inicializas-correctamente-tus-clases-observable-en-swiftui-algnos-errores-pueden-romper-tu-app/</guid><description>&lt;p&gt;🔄 Muchos desarrolladores experimentados siguen teniendo dudas sobre cómo gestionar el ciclo de vida de las clases &lt;code&gt;@Observable&lt;/code&gt; en &lt;code&gt;SwiftUI&lt;/code&gt;. El problema no es solo técnico: es conceptual. Cuando creamos una clase &lt;code&gt;@Observable&lt;/code&gt; en una vista &lt;code&gt;SwiftUI&lt;/code&gt;, podría parecer que no necesitamos &lt;code&gt;@State&lt;/code&gt; porque las propiedades se actualizan automáticamente. Pero aquí está el peligro oculto.&lt;/p&gt;
&lt;p&gt;⚠️ Sin &lt;code&gt;@State&lt;/code&gt;, tu modelo no está vinculado al ciclo de vida de la vista. &lt;code&gt;SwiftUI&lt;/code&gt; recreará una nueva instancia cada vez que la estructura de la vista se reinicialice. Y eso pasa más de lo que crees. Imagina este escenario: tienes un contador en una vista hija. Cambias un color en la vista padre. El body se reconstruye, el inicializador de la vista hija se ejecuta nuevamente, y boom. Tu contador vuelve a cero sin razón aparente.&lt;/p&gt;</description></item><item><title>¿Guardas las API keys directamente en tu app de SwiftUI? Es el error que te costará caro</title><link>https://www.swiftpills.dev/posts/guardas-las-api-keys-directamente-en-tu-app-de-swiftui-es-el-error-que-te-costara-caro/</link><pubDate>Wed, 17 Dec 2025 12:29:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/guardas-las-api-keys-directamente-en-tu-app-de-swiftui-es-el-error-que-te-costara-caro/</guid><description>&lt;p&gt;🚨 Uno de los fallos más comunes en iOS es almacenar claves de API en archivos .plist o .xcconfig sin protección adicional. Aunque mantengas estos archivos fuera del control de versiones, cualquier atacante con herramientas de ingeniería inversa puede extraer las claves del binario compilado en texto plano.&lt;/p&gt;
&lt;p&gt;🔐 El Keychain de iOS es el mecanismo oficial de Apple para almacenar datos sensibles con cifrado. Utiliza el Secure Enclave del dispositivo para proteger credenciales, tokens y claves criptográficas. A diferencia de UserDefaults o archivos locales, el Keychain persiste incluso tras desinstalar la app y ofrece integración con Face ID y Touch ID.&lt;/p&gt;</description></item><item><title>¿Cuatro formas de previsualizar documentos en SwiftUI y no conoces cuál usar? Aquí está la guía definitiva</title><link>https://www.swiftpills.dev/posts/cuatro-formas-de-previsualizar-documentos-en-swiftui-y-no-conoces-cual-usar-aqui-esta-la-guia-definitiva/</link><pubDate>Tue, 16 Dec 2025 11:47:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/cuatro-formas-de-previsualizar-documentos-en-swiftui-y-no-conoces-cual-usar-aqui-esta-la-guia-definitiva/</guid><description>&lt;p&gt;📄 Trabajar con documentos es fundamental en muchas apps iOS: PDFs, imágenes, documentos Office&amp;hellip; Pero no todos los frameworks ofrecen lo mismo. Algunos priorizan simplicidad, otros control total, y cada uno tiene su lugar según tus necesidades.&lt;/p&gt;
&lt;p&gt;🚀 Quick Look es tu primera opción cuando necesitas rapidez y cero configuración. Con una sola línea de código obtienes un visor nativo del sistema que soporta decenas de formatos diferentes sin esfuerzo adicional.&lt;/p&gt;</description></item><item><title>¿SwiftUI ha muerto en 2025? El debate que divide a la comunidad iOS</title><link>https://www.swiftpills.dev/posts/swiftui-ha-muerto-en-2025-el-debate-que-divide-a-la-comunidad-ios/</link><pubDate>Mon, 15 Dec 2025 13:26:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swiftui-ha-muerto-en-2025-el-debate-que-divide-a-la-comunidad-ios/</guid><description>&lt;p&gt;🔄 Un artículo reciente ha provocado una gran controversia al afirmar que 2025 es el año que murió &lt;code&gt;SwiftUI&lt;/code&gt;. La tesis principal: &lt;code&gt;UIKit&lt;/code&gt; ha recibido modernizaciones fundamentales mientras que las herramientas de IA generativa trivializan lo que antes era la gran ventaja de &lt;code&gt;SwiftUI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;🛠️ iOS 18 trajo una revolución silenciosa para &lt;code&gt;UIKit&lt;/code&gt;. Apple añadió soporte para el macro &lt;code&gt;@Observable&lt;/code&gt; y el nuevo método updateProperties() que permite actualizaciones reactivas automáticas, similar a cómo funciona &lt;code&gt;SwiftUI&lt;/code&gt; desde el principio.&lt;/p&gt;</description></item><item><title>¿Gestionar configuración en Swift sigue siendo un dolor de cabeza con código disperso y acoplado? Swift Configuration 1.0 cambia las reglas</title><link>https://www.swiftpills.dev/posts/gestionar-configuracion-en-swift-sigue-siendo-un-dolor-de-cabeza-con-codigo-disperso-y-acoplado-swift-configuration-1-0-cambia-las-reglas/</link><pubDate>Sun, 14 Dec 2025 12:29:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/gestionar-configuracion-en-swift-sigue-siendo-un-dolor-de-cabeza-con-codigo-disperso-y-acoplado-swift-configuration-1-0-cambia-las-reglas/</guid><description>&lt;p&gt;🎯 Hasta ahora, gestionar variables de entorno, archivos JSON, argumentos de línea de comandos y secretos requería código repetitivo y específico para cada origen. Cada fuente necesitaba su propia lógica de lectura, haciendo que el código de la aplicación quedara acoplado a proveedores concretos.&lt;/p&gt;
&lt;p&gt;✨ Swift Configuration introduce una abstración limpia entre cómo accedemos a la configuración y de dónde proviene. Esta separación permite que las librerías acepten una configuración sin dictar el origen. Esto habilita a su vez la composición de configuraciones entre diferentes entornos de despliegue. El verdadero valor no está en leer archivos, sino en la flexibilidad que aporta.&lt;/p&gt;</description></item><item><title>SwiftData en 2025: de código caótico a arquitectura maestra</title><link>https://www.swiftpills.dev/posts/swiftdata-en-2025-de-codigo-caotico-a-arquitectura-maestra/</link><pubDate>Sat, 13 Dec 2025 14:38:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swiftdata-en-2025-de-codigo-caotico-a-arquitectura-maestra/</guid><description>&lt;p&gt;🧩 &lt;code&gt;SwiftData&lt;/code&gt; llegó en 2023 como la evolución de CoreData, prometiendo sintaxis moderna y declarativa. Pero dos años después, muchos desarrolladores siguen luchando con su arquitectura porque intentan forzar patrones antiguos en lugar de aprovechar su diseño.&lt;/p&gt;
&lt;p&gt;🔑 El framework gira en torno a dos componentes esenciales: ModelContainer gestiona el esquema y la persistencia, mientras ModelContext coordina las operaciones de lectura y escritura. Entender esta base es crucial antes de construir sobre ella.&lt;/p&gt;</description></item><item><title>Swift Subprocess: ¿el futuro del scripting en Swift o solo una ilusión?</title><link>https://www.swiftpills.dev/posts/swift-subprocess-el-futuro-del-scripting-en-swift-o-solo-una-ilusion/</link><pubDate>Fri, 12 Dec 2025 12:19:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swift-subprocess-el-futuro-del-scripting-en-swift-o-solo-una-ilusion/</guid><description>&lt;p&gt;🚀 Swift ha luchado durante años por escapar del nicho móvil y expandirse a otros casos de uso como scripting, automatización y herramientas CLI. El problema histórico ha sido Process (antes NSTask), una API heredada de Objective-C que no soporta &lt;code&gt;async/await&lt;/code&gt;, depende de closures y usa excepciones para indicar errores.&lt;/p&gt;
&lt;p&gt;📦 En septiembre de 2024 llegó swift-subprocess, un paquete oficial del proyecto swift-foundation diseñado para revolucionar la creación de procesos en Swift. Promete ergonomía moderna, compatibilidad multiplataforma y soporte nativo para concurrencia con &lt;code&gt;async/await&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>¿Conoces el concepto de identidad en .task de SwiftUI? Cambia por completo cómo manejas operaciones asíncronas</title><link>https://www.swiftpills.dev/posts/conoces-el-concepto-de-identidad-en-task-de-swiftui-cambia-por-completo-como-manejas-operaciones-asincronas/</link><pubDate>Thu, 11 Dec 2025 13:36:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/conoces-el-concepto-de-identidad-en-task-de-swiftui-cambia-por-completo-como-manejas-operaciones-asincronas/</guid><description>&lt;p&gt;🎯 El modificador .task en &lt;code&gt;SwiftUI&lt;/code&gt; no solo ejecuta código asíncrono cuando aparece una vista: también gestiona automáticamente la identidad de esas tareas basándose en el ciclo de vida y los valores que le pasamos.&lt;/p&gt;
&lt;p&gt;🔄 Cuando adjuntas un .task a una vista, &lt;code&gt;SwiftUI&lt;/code&gt; crea una &lt;code&gt;Task&lt;/code&gt; que se cancela automáticamente cuando la vista desaparece. Esto evita fugas de memoria y operaciones que continúan ejecutándose en segundo plano innecesariamente.&lt;/p&gt;
&lt;p&gt;💡 La clave está en entender que .task(id:) permite vincular la tarea a un valor específico. Cada vez que ese valor cambia, &lt;code&gt;SwiftUI&lt;/code&gt; cancela la tarea anterior y ejecuta una nueva. Esto es perfecto para recargar datos cuando cambian filtros o parámetros.&lt;/p&gt;</description></item><item><title>¿SwiftData necesita MVVM o es sobre-ingeniería? Hay un camino intermedio</title><link>https://www.swiftpills.dev/posts/swiftdata-necesita-mvvm-o-es-sobre-ingenieria-hay-un-camino-intermedio/</link><pubDate>Wed, 10 Dec 2025 14:53:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swiftdata-necesita-mvvm-o-es-sobre-ingenieria-hay-un-camino-intermedio/</guid><description>&lt;p&gt;⚖️ Añadir MVVM a esto puede ser sobre-ingeniería si peleas contra el framework. Pero existe un enfoque híbrido que respeta la arquitectura nativa y añade testabilidad solo donde importa.&lt;/p&gt;
&lt;p&gt;🎯 &lt;code&gt;SwiftData&lt;/code&gt; y &lt;code&gt;SwiftUI&lt;/code&gt; están diseñados para trabajar juntos sin capas adicionales. Apple nos da @Query para lectura reactiva y &lt;code&gt;@Environment&lt;/code&gt;(.modelContext) para escritura. Funciona perfecto.&lt;/p&gt;
&lt;p&gt;💡 @Query ya es un ViewModel de lectura: observa la base de datos, actualiza automáticamente las vistas y gestiona el ciclo de vida de los datos. No necesitas replicar esto en otra capa.&lt;/p&gt;</description></item><item><title>¿Confundes .count con .length o usas métodos de NSString en Swift? Estos errores pueden hacer añicos tu app</title><link>https://www.swiftpills.dev/posts/confundes-count-con-length-o-usas-metodos-de-nsstring-en-swift-estos-errores-pueden-hacer-anicos-tu-app/</link><pubDate>Tue, 09 Dec 2025 10:30:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/confundes-count-con-length-o-usas-metodos-de-nsstring-en-swift-estos-errores-pueden-hacer-anicos-tu-app/</guid><description>&lt;p&gt;🚨 El manejo de cadenas en Swift tiene trampas que muchos desarrolladores pisan constantemente. La mayoría provienen de mezclar métodos de Objective-C con tipos nativos de Swift, generando bugs extraños con emojis y caracteres Unicode.&lt;/p&gt;
&lt;p&gt;⚠️ El error más común es usar replacingOccurrences(of:with:) en lugar de replacing(_:with:). El primero viene de &lt;code&gt;NSString&lt;/code&gt; y no respeta las secuencias Unicode. Puede convertir 🇨🇦🇺🇸 en 🇨🇳🇮🇸 sin previo aviso al romper los indicadores regionales.&lt;/p&gt;</description></item><item><title>Números que no hacen salto de línea en SwiftUI: ¿conoces este detalle tipográfico que mejora la legibilidad?</title><link>https://www.swiftpills.dev/posts/numeros-que-no-hacen-salto-de-linea-en-swiftui-conoces-este-detalle-tipografico-que-mejora-la-legibilidad/</link><pubDate>Mon, 08 Dec 2025 13:41:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/numeros-que-no-hacen-salto-de-linea-en-swiftui-conoces-este-detalle-tipografico-que-mejora-la-legibilidad/</guid><description>&lt;p&gt;📱 Cuando trabajamos con textos dinámicos en &lt;code&gt;SwiftUI&lt;/code&gt;, hay un problema visual que muchos pasamos por alto: los números grandes pueden partirse entre líneas de forma incómoda. Por ejemplo, 1 000 000 podría aparecer como 1 000 en una línea y 000 en la siguiente.&lt;/p&gt;
&lt;p&gt;🔍 Este fenómeno afecta especialmente a fechas, cantidades monetarias, números de teléfono y cualquier cifra con separadores. La experiencia de lectura se deteriora porque el usuario debe reconstruir mentalmente el número completo.&lt;/p&gt;</description></item><item><title>¿Swift 6 te parece complicado? Las herramientas de migración automática lo cambiarán todo</title><link>https://www.swiftpills.dev/posts/swift-6-te-parece-complicado-las-herramientas-de-migracion-automatica-lo-cambiaran-todo/</link><pubDate>Sun, 07 Dec 2025 12:14:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swift-6-te-parece-complicado-las-herramientas-de-migracion-automatica-lo-cambiaran-todo/</guid><description>&lt;p&gt;🔄 Swift 6 introduce mejoras importantes en concurrencia y seguridad de datos, pero migrar código existente puede parecer abrumador. Apple lo sabe y está trabajando en herramientas que automatizarán gran parte del proceso.&lt;/p&gt;
&lt;p&gt;🛠️ El nuevo sistema de migración analizará tu código y sugerirá cambios específicos para cumplir con el modelo de concurrencia estricto de Swift 6. No tendrás que buscar manualmente cada warning de &lt;code&gt;Sendable&lt;/code&gt; o actor isolation.&lt;/p&gt;
&lt;p&gt;⚡ Xcode 16 ya incluye capacidades básicas de detección, pero las próximas versiones traerán fix-its inteligentes que aplicarán las correcciones directamente. Piensa en ello como tener un asistente experto en concurrency revisando tu código.&lt;/p&gt;</description></item><item><title>Valores por defecto en interpolación de cadenas de texto: el truco que no conocías en Swift</title><link>https://www.swiftpills.dev/posts/valores-por-defecto-en-interpolacion-de-cadenas-de-texto-el-truco-que-no-conocias-en-swift/</link><pubDate>Sat, 06 Dec 2025 14:43:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/valores-por-defecto-en-interpolacion-de-cadenas-de-texto-el-truco-que-no-conocias-en-swift/</guid><description>&lt;p&gt;🎯 La interpolación de String en Swift es una herramienta que usamos a diario, pero ¿sabías que puedes definir valores por defecto cuando el valor interpolado es nil? Esta técnica puede ahorrarte múltiples líneas de código y hacer tu app más robusta.&lt;/p&gt;
&lt;p&gt;💡 Swift 6.2 nos permite extender el protocolo StringProtocol para personalizar cómo se comporta la interpolación. Esto significa que podemos interceptar valores opcionales y proporcionar alternativas automáticas sin necesidad de usar el operador de coalescencia nula cada vez.&lt;/p&gt;</description></item><item><title>NotificationCenter en Swift 6.2: ¿Sigues usando el método antiguo con warnings de concurrencia?</title><link>https://www.swiftpills.dev/posts/notificationcenter-en-swift-6-2-sigues-usando-el-metodo-antiguo-con-warnings-de-concurrencia/</link><pubDate>Fri, 05 Dec 2025 12:04:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/notificationcenter-en-swift-6-2-sigues-usando-el-metodo-antiguo-con-warnings-de-concurrencia/</guid><description>&lt;p&gt;🚨 El sistema clásico de &lt;code&gt;NotificationCenter&lt;/code&gt; tiene un problema grave: incluso cuando especificas .main como cola, el compilador no puede verificar la seguridad entre hilos. El dominio de aislamiento permanece como nonisolated, lo que genera advertencias del compilador cuando intentas llamar métodos aislados a &lt;code&gt;@MainActor&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;🎯 iOS 26 y Swift 6.2 introducen MainActorMessage y AsyncMessage, dos protocolos que revolucionan cómo trabajamos con notificaciones. Estos nuevos tipos permiten al compilador verificar la seguridad de concurrencia en tiempo de compilación, no en ejecución.&lt;/p&gt;</description></item><item><title>Swift como código abierto cumple 10 años: de proyecto Apple a ecosistema multiplataforma</title><link>https://www.swiftpills.dev/posts/swift-como-codigo-abierto-cumple-10-anos-de-proyecto-apple-a-ecosistema-multiplataforma/</link><pubDate>Thu, 04 Dec 2025 14:23:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/swift-como-codigo-abierto-cumple-10-anos-de-proyecto-apple-a-ecosistema-multiplataforma/</guid><description>&lt;p&gt;🎉 El 3 de diciembre de 2015, Apple liberó Swift bajo licencia Apache 2.0, transformando un lenguaje propietario en un proyecto comunitario global. Una década después, el impacto de esa decisión ha superado todas las expectativas.&lt;/p&gt;
&lt;p&gt;🌍 Hoy Swift es verdaderamente multiplataforma: se ejecuta en Linux (Debian, Fedora, Ubuntu), Windows (incluyendo arquitecturas arm64), y hay vistas previas oficiales para Android y FreeBSD. Ya no es solo el lenguaje de Apple.&lt;/p&gt;</description></item><item><title>UIKit ahora puede observar cambios de estado automáticamente como SwiftUI: adiós al código manual</title><link>https://www.swiftpills.dev/posts/uikit-ahora-puede-observar-cambios-de-estado-automaticamente-como-swiftui-adios-al-codigo-manual/</link><pubDate>Thu, 04 Dec 2025 12:19:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/uikit-ahora-puede-observar-cambios-de-estado-automaticamente-como-swiftui-adios-al-codigo-manual/</guid><description>&lt;p&gt;🎯 iOS 26 marca un antes y un después para los desarrolladores &lt;code&gt;UIKit&lt;/code&gt;. Apple ha integrado el framework Observation directamente en el ciclo de vida de &lt;code&gt;UIKit&lt;/code&gt;, permitiendo que las vistas se actualicen automáticamente cuando cambian las propiedades de objetos marcados con &lt;code&gt;@Observable&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;📝 Hasta ahora, mantener la interfaz sincronizada con los datos en &lt;code&gt;UIKit&lt;/code&gt; requería código tedioso: usar didSet, llamar manualmente setNeedsLayout(), o implementar callbacks con &lt;code&gt;Combine&lt;/code&gt;. Olvidarte de actualizar la UI significaba vistas obsoletas y bugs difíciles de rastrear.&lt;/p&gt;</description></item><item><title>¿Tu app sigue obligando a los usuarios a elegir idioma manualmente? iOS 26 Language Discovery cambia las reglas del juego</title><link>https://www.swiftpills.dev/posts/tu-app-sigue-obligando-a-los-usuarios-a-elegir-idioma-manualmente-ios-26-language-discovery-cambia-las-reglas-del-juego/</link><pubDate>Wed, 03 Dec 2025 11:02:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/tu-app-sigue-obligando-a-los-usuarios-a-elegir-idioma-manualmente-ios-26-language-discovery-cambia-las-reglas-del-juego/</guid><description>&lt;p&gt;🌍 La realidad multilingüe es más compleja de lo que pensamos. Un desarrollador en Toronto programa en inglés, lee documentación técnica en inglés, pero consume noticias en español y escribe a su familia en francés.&lt;/p&gt;
&lt;p&gt;🔍 El problema es que las apps tradicionales los obligan a navegar listas alfabéticas de cientos de idiomas o conformarse con inglés porque es más fácil de encontrar. Esta fricción es exactamente lo que iOS 26 elimina.&lt;/p&gt;</description></item><item><title>Tests parametrizados en Swift Testing: las 5 trampas que debes evitar</title><link>https://www.swiftpills.dev/posts/tests-parametrizados-en-swift-testing-las-5-trampas-que-debes-evitar/</link><pubDate>Tue, 02 Dec 2025 12:54:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/tests-parametrizados-en-swift-testing-las-5-trampas-que-debes-evitar/</guid><description>&lt;p&gt;🚀 SwiftTesting llegó en WWDC24 con una de las funcionalidades más esperadas: los tests parametrizados. En lugar de escribir múltiples tests casi idénticos, podemos ejecutar un solo test con diferentes argumentos automáticamente.&lt;/p&gt;
&lt;p&gt;⚠️ Sin embargo, la conveniencia de parametrizar puede llevarnos a cometer errores sutiles que comprometen la calidad de nuestras pruebas. Migrar decenas de miles de tests ha revelado patrones problemáticos que debemos evitar.&lt;/p&gt;
&lt;p&gt;🔍 Trampa 1: Huecos en la cobertura. Cuando usamos variables opacas en las aserciones, el test puede pasar incluso con bugs reales. Si verificamos que una función devuelve el mismo valor calculado que genera, estamos duplicando la lógica en lugar de validarla.&lt;/p&gt;</description></item><item><title>¿Entiendes realmente cómo funcionan los bucles for-in en Swift? La maquinaria que hay detrás es fascinante</title><link>https://www.swiftpills.dev/posts/entiendes-realmente-como-funcionan-los-bucles-for-in-en-swift-la-maquinaria-que-hay-detras-es-fascinante/</link><pubDate>Mon, 01 Dec 2025 12:59:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/entiendes-realmente-como-funcionan-los-bucles-for-in-en-swift-la-maquinaria-que-hay-detras-es-fascinante/</guid><description>&lt;p&gt;🔄 Cuando escribes for item in lista, el compilador pone en marcha toda una jerarquía de protocolos que trabajan en segundo plano. Lo que parece una simple iteración es en realidad un sistema elegante basado en Sequence e IteratorProtocol.&lt;/p&gt;
&lt;p&gt;🎯 En Swift, Sequence es el protocolo base que permite iterar sobre una colección de elementos. Su único requisito es proporcionar un iterador mediante el método makeIterator(). El iterador, a su vez, solo necesita implementar un método: next(), que devuelve el siguiente elemento o nil cuando termina.&lt;/p&gt;</description></item><item><title>Thread safety en Swift: ¿GCD con barreras, OSAllocatedUnfairLock o actors?</title><link>https://www.swiftpills.dev/posts/thread-safety-en-swift-gcd-con-barreras-osallocatedunfairlock-o-actors/</link><pubDate>Fri, 28 Nov 2025 10:40:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/thread-safety-en-swift-gcd-con-barreras-osallocatedunfairlock-o-actors/</guid><description>&lt;p&gt;🔒 Garantizar seguridad entre hilos es uno de los retos más complejos en desarrollo iOS. Un simple diccionario compartido puede provocar condiciones de carrera, crashes o estados corruptos si varios hilos escriben y leen simultáneamente sin la sincronización adecuada.⚙️ La solución clásica con &lt;code&gt;GCD&lt;/code&gt; usa colas concurrentes con lecturas síncronas y escrituras asíncronas. Pero sin el flag .barrier, las lecturas y escrituras pueden solaparse, creando inconsistencias. El patrón recomendado es lecturas concurrentes y escrituras serializadas mediante barriers.🚀 OSAllocatedUnfairLock llega en iOS 16 como el wrapper moderno de os_unfair_lock. Gestiona memoria automáticamente, es &lt;code&gt;Sendable&lt;/code&gt;, y su API withLock elimina el riesgo de olvidar liberar el lock. Usa la misma primitiva del kernel que su predecesor pero sin interoperabilidad con C.🛡️ Los actores de Swift Concurrency eliminan colas y barreras por completo. Aislan el estado mutable garantizando que solo una tarea pueda acceder a él simultáneamente. El compilador y el runtime manejan la sincronización sin bloqueos explícitos ni riesgo de deadlocks.🔬 Internamente, los actors gestionan una cola de tareas pendientes y un flag para indicar si están activos. Cuando una tarea llama a un método del actor, Swift la encola. El actor procesa su cola secuencialmente, ejecutando una tarea a la vez, lo que garantiza aislamiento total del estado.⚡ Si priorizas rendimiento y seguridad con &lt;code&gt;GCD&lt;/code&gt;, usa .barrier. Para compatibilidad total con Swift 6 y simplificar tu código, los actores son el camino. Apple recomienda migrar de os_unfair_lock a OSAllocatedUnfairLock para garantizar comportamiento correcto del locking.👨‍💻 ¿Ya estás usando actores en tus proyectos o sigues confiando en &lt;code&gt;GCD&lt;/code&gt;? La evolución del ecosistema Swift apunta claramente hacia concurrencia estructurada y la seguridad de datos por defecto.&lt;/p&gt;</description></item><item><title>Conformar protocolos en Swift 6: navegando por los desafíos de aislamiento de actores</title><link>https://www.swiftpills.dev/posts/conformar-protocolos-en-swift-6-navegando-por-los-desafios-de-aislamiento-de-actores/</link><pubDate>Thu, 27 Nov 2025 10:55:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/conformar-protocolos-en-swift-6-navegando-por-los-desafios-de-aislamiento-de-actores/</guid><description>&lt;p&gt;🧩 Uno de los aspectos más complejos de la concurrencia en Swift es hacer que tipos aislados a actores conformen protocolos que no fueron diseñados con concurrencia.🎯 El problema es común: tienes un tipo marcado con &lt;code&gt;@MainActor&lt;/code&gt; que necesita conformar Equatable, Codable o cualquier otro protocolo estándar.⚠️ Aparece el temido error: Conformance crosses into main actor-isolated code and can cause data races.🔍 La raíz del problema está en que protocolos como Equatable esperan implementaciones nonisolated, es decir, que funcionen desde cualquier contexto.🛠️ Swift 6.2 introduce isolated conformances (SE-0470), que permiten restringir una conformación a un actor global específico.💡 Con esta nueva característica, puedes escribir tipo como extension ImageModel: &lt;code&gt;@MainActor&lt;/code&gt; Equatable y el compilador entiende la restricción de contexto.🚀 El ajuste InferIsolatedConformances, que hace esto automáticamente cuando está habilitado, parte del nuevo enfoque Approachable Concurrency en Xcode 26.🔄 Antes de Swift 6.2, la solución era @preconcurrency conformances (SE-0423), que funciona, pero semánticamente sugiere que el protocolo está desactualizado y no es seguro.⚡ Otra alternativa es usar nonisolated + MainActor.assumeIsolated, aunque es verboso y puede introducir verificaciones en tiempo de ejecución peligrosas.🎨 Existe un enfoque alternativo poco conocido: diseñar tipos como no &lt;code&gt;Sendable&lt;/code&gt; y nonisolated desde el inicio, dejando que el compilador prevenga su escape.🔒 Los tipos no &lt;code&gt;Sendable&lt;/code&gt; quedan automáticamente atrapados en el dominio de aislamiento donde se crean, sin necesidad de marcas explícitas de actor.🧠 Este principio no &lt;code&gt;Sendable&lt;/code&gt; por definición puede ser la solución más simple o la más compleja, dependiendo de las necesidades internas del tipo.👨‍💻 Dominar estos patrones de conformance es esencial para migrar proyectos a Swift 6 sin comprometer la seguridad de datos.​​​​​​​​​​​​​​​​ Lamentablemente no hay una regla o patrón eficaz y la mejor implementación depende del caso concreto.&lt;/p&gt;</description></item><item><title>Gauge, ProgressView o Slider en SwiftUI: ¿cuál usar en cada caso?</title><link>https://www.swiftpills.dev/posts/gauge-progressview-o-slider-en-swiftui-cual-usar-en-cada-caso/</link><pubDate>Wed, 26 Nov 2025 13:56:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/gauge-progressview-o-slider-en-swiftui-cual-usar-en-cada-caso/</guid><description>&lt;p&gt;🎯 Aunque parecen similares, estos tres componentes nativos de &lt;code&gt;SwiftUI&lt;/code&gt; tienen propósitos completamente distintos.&lt;/p&gt;
&lt;p&gt;Elegir el correcto marca la diferencia entre una interfaz intuitiva y una confusa.&lt;/p&gt;
&lt;p&gt;📊 Gauge es para mostrar valores medidos dentro de un rango. Introducido en iOS 16, es ideal para representar temperatura, nivel de batería o uso de CPU.&lt;/p&gt;
&lt;p&gt;A diferencia de los otros, es de solo lectura: el usuario no puede interactuar con él para cambiar el valor.&lt;/p&gt;</description></item><item><title>¿Sabías que el modelo de Foundation Models tiene un límite de contexto que puede romper tu app?</title><link>https://www.swiftpills.dev/posts/sabias-que-el-modelo-de-foundation-models-tiene-un-limite-de-contexto-que-puede-romper-tu-app/</link><pubDate>Tue, 25 Nov 2025 12:44:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/sabias-que-el-modelo-de-foundation-models-tiene-un-limite-de-contexto-que-puede-romper-tu-app/</guid><description>&lt;p&gt;🧠 El modelo on-device de Apple Intelligence opera con una ventana de contexto fija de 4096 tokens por sesión. Esto incluye todas las instrucciones, prompts y respuestas generadas durante la conversación. Cuando se supera este límite, la app lanza un error exceededContextWindowSize que puede interrumpir completamente la experiencia del usuario.&lt;/p&gt;
&lt;p&gt;⚡ Un token no es exactamente una palabra. El modelo divide el texto en pequeñas subcadenas que pueden ser palabras completas, fragmentos o incluso caracteres individuales. Apple no expone públicamente un tokenizador ni metadatos de uso, por lo que calcular cuántos tokens consumes es complicado y la mayoría de desarrolladores nos enfrentamos a esto a ciegas.&lt;/p&gt;</description></item><item><title>¿Tus vistas de SwiftUI parecen novelas interminables? La arquitectura es la solución</title><link>https://www.swiftpills.dev/posts/tus-vistas-de-swiftui-parecen-novelas-interminables-la-arquitectura-es-la-solucion/</link><pubDate>Mon, 24 Nov 2025 10:05:00 +0100</pubDate><guid>https://www.swiftpills.dev/posts/tus-vistas-de-swiftui-parecen-novelas-interminables-la-arquitectura-es-la-solucion/</guid><description>&lt;p&gt;📚 A medida que los proyectos crecen, el body de nuestras vistas acumula decenas de VStacks, HStacks y modificadores anidados hasta volverse ilegible.Scrollear por el código se convierte en un martirio. El problema no es la cantidad de líneas, sino la falta de estructura clara.🚫 Muchos desarrolladores intentan “arreglarlo” moviendo código a extensiones y propiedades computadas en el mismo archivo. Esto solo desplaza el problema.La legibilidad no mejora realmente y el archivo sigue siendo igual de largo. Necesitamos una estrategia mejor para construir arquitectura en &lt;code&gt;SwiftUI&lt;/code&gt;.🎯 La clave está en extraer vistas dedicadas cuando una porción de UI tiene un propósito claro y potencial de reutilización. Cada vista debe tener una única responsabilidad.Esto permite previsualizar estados individuales y facilita el mantenimiento a largo plazo del código.🎨 Los ViewModifiers personalizados son perfectos para consolidar combinaciones repetitivas de estilos que definen tu lenguaje de diseño.Puedes actualizar la apariencia de toda tu app desde un único punto. Además, funcionan como extensiones de View para mayor conveniencia.🔄 Las extensiones genéricas de View ayudan cuando repites layouts similares constantemente, como encabezados de sección con formato consistente.Reducen la indentación del código y mantienen tu interfaz coherente sin duplicar implementaciones.🧩 &lt;code&gt;SwiftUI&lt;/code&gt; está diseñado desde cero para composición y reutilización. Aprovecha esa arquitectura: descompón interfaces complejas en bloques pequeños y combínalos.Vistas más simples significan código más fácil de leer, probar y mantener. La meta no es minimizar líneas, sino maximizar claridad.👨‍💻 Una buena arquitectura &lt;code&gt;SwiftUI&lt;/code&gt; transforma el caos en componentes limpios, componibles y testeables. ¿Ya estructuras tus vistas para reutilización?&lt;/p&gt;</description></item></channel></rss>