name: ios-architecture
description: Apply MVVM, Coordinators, and Clean Architecture (VIP/VIPER) in iOS apps. Use when applying MVVM, Coordinators, or VIP/VIPER architecture in iOS apps.
metadata:
triggers:
files:
- '/*ViewModel.swift'
- '/*Coordinator.swift'
- '**/*ViewController.swift'
keywords:
- MVVM
- Coordinator
- ViewState
- Output
- Input
iOS Architecture Standards
Priority: P0 (CRITICAL)
Implementation Guidelines
MVVM (Model-View-ViewModel)
- ViewModel Responsibility: Handle business logic, formatting, and state. No UIKit imports (except for platform types like
UIImage if strictly necessary).
- ViewState: Use single state object or discrete
@Published properties for UI updates. Expose state as private(set) or using publishers.
- Inputs/Outputs: Define explicit protocols or nested types for inputs (events from View) and outputs (state for View).
Coordinator Pattern
- Navigation Logic: Decouple ViewControllers from navigation logic. Coordinator handles instantiation and push/present. ** NOT use
navigationController directly in ViewController for screen transitions.**
- Dependency Injection: Pass dependencies (Services, Repositories) through Coordinator into ViewModels.
- Child Coordinators: Maintain hierarchy; correctly remove child coordinators from parent's collection when their flow finished.
Clean Architecture (VIP/VIPER)
- VIP (Clean Swift): Use Interactor for logic, Presenter for UI formatting, and ViewController for display.
- Unidirectional Flow: Data flows: View -> Interactor -> Presenter -> View.
- VIPER: (View, Interactor, Presenter, Entity, Router) — another common architectural pattern for iOS apps.
Anti-Patterns
- No Logic in VC: Move business logic to ViewModel/Interactor.
- No Public ViewModel State: Keep state private(set) or using publishers.
- No Direct Navigation: Use Coordinator for screen transitions. Never use
navigationController directly.
Verification Checklist (Mandatory)
References
Canonical response anchors
When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant:
- Inputs/Outputs
- UIImage
- ViewModel Responsibility
Remediation anchors
- Remediation anchors: ViewState, @Published, explicit Inputs/Outputs