wandres.dev
TCA: arquitectura y testing en Swift

Domina Composable Architecture
hasta nivel dios

The Composable Architecture de Point-Free: State, Action, Reducer, Effect y Store; composición, @Dependency, navegación como dato y testing exhaustivo.

La ruta

32 niveles, de novato a dios

Cada nivel construye sobre el anterior. Sin saltos, sin huecos.

Ontología Nivel 0 · El mapa de TCA

La visión aérea de The Composable Architecture: State, Action, Reducer, Effect y Store; composición, dependencias y testing exhaustivo.

Mapa mentalTCA

TCA: el modelo Nivel 1 · Point-Free en Swift

The Composable Architecture: el Elm/Redux de Swift por Point-Free; flujo unidireccional para SwiftUI.

TCASwiftPoint-Free

Reducers y efectos Nivel 2 · State, Action, Effect

El reducer de TCA: una función pura de estado y acción que devuelve efectos; Effect para lo asíncrono.

reducerEffectstore

Composición y test Nivel 3 · dependencies, TestStore

La C de Composable: componer reducers, la inyección de dependencias, y el testing exhaustivo con TestStore.

composicióndependenciesTestStore

Swift para TCA Nivel 4 · value types y macros

Las piezas del lenguaje que TCA explota: structs y enums como valores, protocolos, y las macros de Swift 5.9+.

Swiftmacrosvalue types

La macro @Reducer Nivel 5 · el boilerplate desaparece

Cómo `@Reducer` genera el andamiaje: el enum de acciones, los conformances, y qué escribe realmente por ti.

@Reducermacrocodegen

@ObservableState Nivel 6 · observación fina

La observación moderna: `@ObservableState` sobre el Observation framework; SwiftUI solo redibuja lo que cambió.

@ObservableStateObservationSwiftUI

Modelar el State Nivel 7 · el dominio como valor

Diseñar el State: structs anidadas, hacer imposibles los estados inválidos, y qué NO debe vivir en el estado.

Statedominiomodelar

Modelar la Action Nivel 8 · enums que cuentan qué pasó

Diseñar las acciones: eventos de usuario vs respuestas del sistema, acciones anidadas, y BindableAction.

ActionenumBindable

El body del reducer Nivel 9 · operadores y orden

El `body`: componer con `Reduce`, el orden de ejecución de los operadores, y `_printChanges` para depurar.

bodyReduceorden

Effect a fondo Nivel 10 · async como valor

Los efectos: `.run` con async/await, `.send` desde dentro, `.none`, y por qué el efecto es un valor devuelto y no un side effect.

Effectasyncrun

Cancelación Nivel 11 · debounce y throttle

Controlar el tiempo: `.cancellable`, cancelar por id, debounce de búsquedas, y evitar respuestas obsoletas.

cancelardebounceid

El sistema @Dependency Nivel 12 · inyección sin ceremonia

swift-dependencies: `@Dependency`, el DependencyValues, y por qué sustituir el reloj y la red cambia el testing.

@DependencyDIvalores

DependencyKey Nivel 13 · live, test y preview

Definir tu propia dependencia: `DependencyKey`, los valores liveValue/testValue/previewValue, y `@DependencyClient`.

DependencyKeylivetest

Composición: Scope Nivel 14 · padre e hijo

Conectar un reducer hijo dentro del padre con `Scope`; el key path del estado y el case path de la acción.

Scopekey pathcase path

Colecciones Nivel 15 · forEach e IdentifiedArray

Listas de features: `IdentifiedArray`, el operador `forEach`, y acciones dirigidas a un elemento por id.

forEachIdentifiedArraylistas

Opcionales y enums Nivel 16 · ifLet e ifCaseLet

Features opcionales: `ifLet` para estado opcional y `ifCaseLet` para un enum de destinos; el ciclo de vida del hijo.

ifLetifCaseLetopcional

Navegación como dato Nivel 17 · el árbol de estado

La idea central: la navegación es estado, no imperativo; modelar a dónde estás como un valor del dominio.

navegaciónestadodato

@Presents Nivel 18 · sheets, alerts, popovers

Presentación basada en estado: `@Presents`, `PresentationAction`, y conectar sheets, alertas y diálogos de confirmación.

@Presentssheetalert

StackState Nivel 19 · navegación en pila

Pilas de navegación: `StackState` y `StackAction`, empujar y sacar pantallas, y el deep linking como estado inicial.

StackStatepiladeep link

Bindings y SwiftUI Nivel 20 · formularios

Conectar controles de SwiftUI: `@Bindable`, `BindingReducer`, y formularios sin escribir una acción por campo.

bindingformulariosSwiftUI

TestStore Nivel 21 · testing exhaustivo

El TestStore: afirmar CADA cambio de estado y CADA efecto; si algo cambia y no lo declaras, el test falla.

TestStoreexhaustivoassert

Testear efectos Nivel 22 · relojes y tiempo

Testear lo asíncrono: relojes controlados (`TestClock`), avanzar el tiempo a mano, y testear debounce y timers.

TestClocktiempoasync

Testing no exhaustivo Nivel 23 · y de integración

Cuando el testing exhaustivo estorba: `exhaustivity = .off`, tests de integración de varias features, y el equilibrio.

no exhaustivointegración

@Shared Nivel 24 · estado compartido

La herramienta `@Shared`: compartir estado entre features sin duplicarlo, con semántica de valor y testeable.

@Sharedcompartirvalor

Persistencia Nivel 25 · @Shared y almacenamiento

Persistir con `@Shared`: appStorage, fileStorage, estrategias propias, y el estado que sobrevive al cierre de la app.

persistenciaappStoragefileStorage

Modularizar Nivel 26 · paquetes SPM

Arquitectura a escala: una feature por módulo SPM, tiempos de compilación, previews aislados y fronteras claras.

SPMmódulosescala

TCA con UIKit Nivel 27 · más allá de SwiftUI

Usar TCA desde UIKit: observar el store, actualizar la vista imperativa, y migrar pantalla a pantalla.

UIKitobservarmigrar

Rendimiento Nivel 28 · observación y coste

El coste de TCA: observación granular, evitar recomputar, el tamaño del State, y medir con Instruments.

rendimientoobservaciónInstruments

Migrar a TCA Nivel 29 · una app existente

Adoptar TCA sin reescribir: empezar por una pantalla, convivir con MVVM, y la estrategia incremental.

migraciónincrementalMVVM

TCA vs alternativas Nivel 30 · el juicio honesto

TCA frente a MVVM con @Observable y otras arquitecturas: qué gana, qué cuesta, y cuándo NO usar TCA.

comparaciónMVVMtrade-offs

Nivel Dios: síntesis Nivel 31 · componer todo

La síntesis: arquitectar una app completa con TCA, el ecosistema Point-Free, y llevarse las ideas a cualquier plataforma.

síntesisarquitecturaPhD
156lecciones
32niveles
0→∞de cero a dios

¿Listo para dominar Composable Architecture?

Empieza por los fundamentos y sube nivel a nivel hasta el dominio total.

Comenzar el camino →