# IOS Architecture

> Standards for MVVM, Coordinators, and Clean Architecture (VIP/VIPER). Use when applying MVVM, Coordinators, or VIP/VIPER architecture in iOS apps. (triggers: **/*ViewModel.swift, **/*Coordinator.swift, **/*ViewController.swift, MVVM, Coordinator, ViewState, Output, Input)

- Skill: `comeonoliver/ios-architecture` (Agent Skill)
- Install (CLI): `npx skillmds@latest add comeonoliver/ios-architecture`
- Raw SKILL.md: https://api.skillmd.com/api/skills/comeonoliver/ios-architecture/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: ComeOnOliver (https://skillmd.com/u/comeonoliver)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/comeonoliver/ios-architecture

---


# 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 a 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. The **Coordinator handles instantiation and push/present**. **Do NOT use `navigationController` directly in the ViewController for screen transitions.**
- **Dependency Injection**: **Pass dependencies** (Services, Repositories) through the **Coordinator into the ViewModels**.
- **Child Coordinators**: Maintain a hierarchy; **correctly remove child coordinators** from the parent's collection when their flow is 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 a Coordinator for screen transitions. Never use `navigationController` directly.

## Verification Checklist (Mandatory)

- [ ] **Pure ViewModel**: Does the ViewModel have any `UIKit` imports? (Prohibited)
- [ ] **Navigation**: Is `navigationController` used directly in the VC for transitions? (Use Coordinator)
- [ ] **State Access**: Is ViewModel state exposed as `public var`? (Use `private(set)` or publishers)
- [ ] **Deallocation**: Are child coordinators correctly removed from the parent's collection on finish?
- [ ] **VIP Unidirection**: Is the data flow unidirectional (View -> Interactor -> Presenter -> View)?

## References

- [MVVM-C & VIP Implementation](references/implementation.md)


