skills/pproenca/dot-skills/swift-refactor

swift-refactor

SKILL.md

Swift/SwiftUI Refactor (Modular MVVM-C)

Comprehensive refactoring guide for migrating Swift/SwiftUI code to modular MVVM-C with local SPM package boundaries and App-target composition root wiring.

Mandated Architecture Stack

┌───────────────────────────────────────────────────────────────┐
│ App target: DependencyContainer, Coordinators, Route Shells   │
├───────────────────────────────────────────────────────────────┤
│ Feature modules: View + ViewModel (Domain + DesignSystem deps)│
├───────────────────────────────────────────────────────────────┤
│ Data package: repositories, remote/local stores, sync, retry  │
├───────────────────────────────────────────────────────────────┤
│ Domain package: models, repository/coordinator/error protocols │
└───────────────────────────────────────────────────────────────┘

Dependency Rule: Feature modules never import Data and never import sibling features.

Clinic Architecture Contract (iOS 26 / Swift 6.2)

All guidance in this skill assumes the clinic modular MVVM-C architecture:

  • Feature modules import Domain + DesignSystem only (never Data, never sibling features)
  • App target is the convergence point and owns DependencyContainer, concrete coordinators, and Route Shell wiring
  • Domain stays pure Swift and defines models plus repository, *Coordinating, ErrorRouting, and AppError contracts
  • Data owns SwiftData/network/sync/retry/background I/O and implements Domain protocols
  • Read/write flow defaults to stale-while-revalidate reads and optimistic queued writes
  • ViewModels call repository protocols directly (no default use-case/interactor layer)

When to Apply

Reference these guidelines when:

  • Migrating from deprecated SwiftUI APIs (ObservableObject, NavigationView, old onChange)
  • Restructuring state management to use @Observable ViewModels
  • Adding @Equatable diffing to views for performance
  • Decomposing large views into 10-node maximum bodies
  • Refactoring navigation to coordinator + route shell pattern
  • Refactoring to Domain/Data/Feature/App package boundaries
  • Setting up dependency injection through DependencyContainer
  • Improving list/collection scroll performance
  • Replacing manual Task management with .task(id:) and cancellable loading

Non-Negotiable Constraints (iOS 26 / Swift 6.2)

  • @Observable ViewModels/coordinators, ObservableObject / @Published never
  • NavigationStack is owned by App-target route shells and coordinators
  • @Equatable macro on every view, AnyView never
  • Domain defines repository/coordinator/error-routing protocols; no framework-coupled I/O
  • No dedicated use-case/interactor layer; ViewModels call repository protocols directly
  • Views never access repositories directly

Rule Categories by Priority

Priority Category Impact Prefix Rules
1 View Identity & Diffing CRITICAL diff- 4
2 API Modernization CRITICAL api- 7
3 State Architecture CRITICAL state- 6
4 View Composition HIGH view- 7
5 Navigation & Coordination HIGH nav- 5
6 Layer Architecture HIGH layer- 5
7 Architecture Patterns HIGH arch- 5
8 Dependency Injection MEDIUM-HIGH di- 2
9 Type Safety & Protocols MEDIUM-HIGH type- 4
10 List & Collection Performance MEDIUM list- 4
11 Async & Data Flow MEDIUM data- 3
12 Swift Language Fundamentals MEDIUM swift- 8

Quick Reference

1. View Identity & Diffing (CRITICAL)

2. API Modernization (CRITICAL)

3. State Architecture (CRITICAL)

4. View Composition (HIGH)

5. Navigation & Coordination (HIGH)

6. Layer Architecture (HIGH)

7. Architecture Patterns (HIGH)

8. Dependency Injection (MEDIUM-HIGH)

9. Type Safety & Protocols (MEDIUM-HIGH)

10. List & Collection Performance (MEDIUM)

11. Async & Data Flow (MEDIUM)

12. Swift Language Fundamentals (MEDIUM)

How to Use

Read individual reference files for detailed explanations and code examples:

Reference Files

File Description
references/_sections.md Category definitions and ordering
assets/templates/_template.md Template for new rules
Weekly Installs
37
GitHub Stars
71
First Seen
Feb 8, 2026
Installed on
codex33
gemini-cli32
opencode31
claude-code31
github-copilot31
kimi-cli31