Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Selects, reviews, and migrates Apple-platform app architectures across MV with Observation, MVVM, MVI, TCA, Clean Architecture, Coordinator, and legacy VIPER. Use when choosing module and dependency boundaries, escalating a feature beyond simple SwiftUI MV, planning incremental architecture migration, or auditing state ownership and test seams.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 42% | 0% |
Choose the smallest architecture that makes state ownership, dependencies, side effects, and tests explicit. Default new SwiftUI features to MV; escalate only for observed complexity.
This skill owns pattern selection, module boundaries, dependency direction, migration strategy, and architecture-level test seams. Route SwiftUI property-wrapper wiring and view composition to swiftui-patterns, navigation APIs and route models to swiftui-navigation, isolation diagnostics to swift-concurrency, and test syntax/fixtures to swift-testing.
| Pattern | Choose when | Main cost | |---|---|---| | MV | SwiftUI feature has straightforward state and orchestration | Logic can drift into large views without decomposition | | MVVM | Presentation logic needs an independently testable adapter | Extra layer can become a forwarding shell | | MVI | A feature is best modeled as explicit state + intents + reducer/effects | Boilerplate and centralized transition design | | TCA | Many composable features need deterministic effects, dependencies, and testing | Framework learning and architectural commitment | | Clean Architecture | Large product needs strict dependency direction across domain/data/UI | Protocol and mapping overhead | | Coordinator | UIKit or hybrid navigation needs a separate flow owner | Another lifecycle and routing owner | | VIPER | Maintaining an existing UIKit module with established VIPER boundaries | Very high ceremony; poor default for new SwiftUI work |
Use Coordinator alongside another state pattern when navigation complexity is the pressure; it is not a replacement for domain/state architecture.
Keep views as state expressions and put business operations in observable models and injected services:
swift@MainActor @Observable final class TripStore { private let client: TripClient var trips: [Trip] = [] var error: Error? init(client: TripClient) { self.client = client } func load() async { do { trips = try await client.fetchTrips() } catch { self.error = error } } } struct TripList: View { @State private var store: TripStore init(client: TripClient) { _store = State(initialValue: TripStore(client: client)) } var body: some View { List(store.trips) { Text($0.name) } .task { await store.load() } } }
Load Architecture Pattern Recipes for MVVM, MVI, TCA, Clean Architecture, Coordinator, and VIPER structure.
Do not escalate merely because a view is long. First extract subviews, services, and focused observable models.
Migrate one feature boundary at a time:
For ObservableObject to Observation, preserve the same owner and mutation isolation before replacing wrappers. For MVVM to MV, delete forwarding view-model members only after views bind to the same model/service behavior. For TCA adoption, wrap one feature's state/actions/effects and migrate dependencies incrementally.
| Mistake | Fix | |---|---| | Pattern chosen by popularity | Tie it to an observed feature pressure. | | View model only forwards properties | Remove it and use MV. | | One object owns navigation, networking, formatting, persistence, and UI state | Split by responsibility and dependency direction. | | TCA or Clean Architecture applied to trivial screens | Start with MV and preserve an escalation seam. | | Coordinator used as a state architecture | Keep it focused on route/lifecycle ownership. | | Multiple patterns mixed inside one feature | Define one local state/effect model and migrate at feature boundaries. | | Big-bang migration | Move one tested vertical slice and rerun the same proof matrix. |
Other measured skills in the registry, with their headline benchmark lift.