Swift Refresh 2025 – Día 4 (Parte 2): Observation moderna y UIKit reactivo
Un repaso profundo a la segunda parte del Día 4: Observation como AsyncSequence, UIKit verdaderamente reactivo con modelos observables y notificaciones tipadas.
Introducción
En la primera parte del Día 4 vimos cómo Swift 6 te obliga a modelar explícitamente memoria y concurrencia.
Esta segunda parte conecta esos conceptos con algo igual de importante: la reactividad.
Observation y UIKit no se presentan como temas aislados.
Apple los conecta como partes del mismo sistema.
La reactividad no es automática.
Tampoco es un hack.
Es un modelo de datos.
1. Observation en iOS 17: reactivo, pero manual
Con @Observable y withObservationTracking, Apple introduce reactividad real.
Pero el patrón inicial tenía fricción:
- el observer se dispara una vez
- hay que re-suscribirse manualmente
- closures
Sendable - manejo explícito del
MainActor
Funciona, pero se siente como una transición.
2. Observation en iOS 26: el estado como stream
En iOS 26 aparece Observations.
let updates = Observations { download.progress }
for await value in updates { print(value)}Ahora:
Observationes unAsyncSequence- no hay callbacks
- no hay re-suscripciones
- los cambios son transaccionales
La reactividad deja de ser un hack.
Ahora es un modelo de datos.
3. Diffable Data Sources: identidad antes que animación
DiffableDataSource no es una API de animaciones.
Es una API de identidad:
Hashabledefine qué es el mismo elemento- el snapshot define el estado actual
- UIKit decide cómo transicionar
Esto prepara el terreno para UIKit reactivo.
4. UIKit reactivo: configurationUpdateHandler
En iOS 26, UIKit da un paso importante.
Cada celda puede reaccionar a cambios mediante:
cell.configurationUpdateHandler = { cell, state in var content = UIListContentConfiguration.subtitleCell() content.text = item.fullName content.secondaryText = item.email cell.contentConfiguration = content}Esto permite:
- reconfigurar sin reaplicar snapshots
- reaccionar a cambios de estado
- conectar UIKit con Observation
UIKit deja de ser completamente imperativo.
5. El problema real: los DTOs no son reactivos
Aquí aparece el choque conceptual:
struct Employeees inmutable- no emite cambios
- no puede ser observado
En SwiftUI solucionabas esto actualizando el array completo.
En UIKit Diffable, eso no escala bien.
6. La solución: modelos de celda observables
El patrón correcto termina siendo:
- DTO (
Employee) →struct - Modelo de celda (
EmployeeCell) →@Observable class
@Observable @MainActorfinal class EmployeeCell { var firstName: String var lastName: String}Ahora:
- Diffable usa
EmployeeCell - cambiar propiedades dispara actualización
- la celda se refresca sola
Esto es UIKit verdaderamente reactivo.
7. Notificaciones tipadas: adiós Notification.Name
iOS 26 introduce notificaciones tipadas:
struct EmployeesDidUpdate: NotificationCenter.MainActorMessage { typealias Subject = EmployeeLogic}Ventajas:
- type-safe
- aislamiento explícito
- sin strings mágicos
- mejor lifecycle
8. ObservationToken: el detalle que rompe todo
Si no retienes el ObservationToken:
- el observer se libera
- la notificación nunca llega
- nada funciona
Swift no avisa.
La arquitectura falla en silencio.
Guardar el token es obligatorio.
Conclusión
Swift ya no intenta protegerte. Te obliga a decidir.
Esta segunda parte del Día 4 deja algo muy claro:
- La reactividad no es automática
- Los DTOs no son reactivos por sí solos
- UIKit puede ser verdaderamente reactivo si lo diseñas así
Swift te da herramientas.
Pero ahora te exige intención.
Y aunque eso incomoda, es lo que hace que todo el sistema finalmente sea coherente.
Notas tomadas durante el Swift Developer Workshop 2025 (Apple Coding Academy) y reinterpretadas desde una perspectiva práctica y real-world.
Relacionados
-
- swift
- swift-cero-experto
- swift-fundamentals
Swift de Cero a Experto #15: Tipos opacos y tipos de protocolo encajonados
La tercera puerta para salir de 'no quiero nombrar el tipo concreto'. some oculta un tipo concreto conservando su identidad — sin caja, en tiempo de compilación. any borra el tipo en una caja de runtime. Así devuelves por fin un protocolo que tiene un associatedtype.
-
- swift
- swift-cero-experto
- swift-fundamentals
Swift de Cero a Experto #14: Genéricos
Un solo swapTwoValues, un solo Stack<Element>, un solo findIndex — escritos una vez, funcionando para todo tipo. Los genéricos dejan que el llamador elija el tipo concreto, que el compilador especialice el código, y que la caja del #13 desaparezca. Array, Dictionary, Optional y Result fueron genéricos todo el tiempo.
-
- swift
- swift-cero-experto
- swift-fundamentals
Swift de Cero a Experto #13: Protocolos
Un protocolo es un contrato, no una clase. Dice qué debe hacer un tipo sin decir qué es — y esa sola idea impulsa la delegación, el Equatable sintetizado, los existenciales y las extensiones de protocolo que hacen idiomático a Swift.