mcpField
S
swift-refactor

swift-refactor

github.com/pproenca開発218278 回インストール11 週間前に更新
リポジトリ

swift-refactor について

Swift/SwiftUIアプリを、Domain・Data・Feature・Appに分けたモジュール型MVVM-Cへリファクタリングするためのガイドです。iOS 26/Swift 6.2の設計契約に基づき、API、状態管理、ナビゲーション、パフォーマンスの改善を扱います。

主な機能

  1. 01モジュール型MVVM-Cの構成指針
  2. 02SwiftUI APIのモダナイズ規則
  3. 03Observable ViewModelと状態設計
  4. 04Coordinatorによるナビゲーション
  5. 05ビュー識別とリスト性能の規則

活用シーン

  1. 01旧式SwiftUIのナビゲーションと状態APIの移行
  2. 02アプリをDomain、Data、Feature、Appに分割
  3. 03差分計算を改善するビューとリストのリファクタリング
  4. 04手動のタスク管理をキャンセル可能な読み込みに置き換え

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pproenca/dot-skills --skill swift-refactor

インストール後、Claude Code で/swift-refactorを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

metadata.json
assets/templates/
_template.md
references/
_sections.md
api-alert-confirmation-dialog.md
api-environment-object-removal.md
api-list-foreach-identifiable.md
api-navigationstack-migration.md
api-observable-macro.md
api-onchange-signature.md
api-toolbar-migration.md
arch-environment-key-injection.md
arch-feature-module-extraction.md
arch-model-view-separation.md
arch-protocol-dependencies.md
arch-viewmodel-elimination.md
data-cancellation.md
data-error-loadable.md
data-task-modifier.md
di-container-composition.md
di-mock-testing.md
diff-closure-skip.md
diff-equatable-views.md
diff-identity-stability.md
diff-printchanges-debug.md
layer-dependency-rule.md
layer-no-view-repository.md
layer-repository-protocol.md
layer-usecase-protocol.md
layer-viewmodel-boundary.md
list-constant-viewcount.md

詳細

Swift/SwiftUI のリファクタリング(モジュール化された MVVM-C)

Swift/SwiftUI のコードを、ローカルの SPM パッケージ境界と App ターゲットのコンポジションルート配線を備えたモジュール化 MVVM-C に移行するための包括的なリファクタリングガイドです。

必須のアーキテクチャスタック

┌───────────────────────────────────────────────────────────────┐
│ 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 │
└───────────────────────────────────────────────────────────────┘

依存関係のルール:Feature モジュールは Data をインポートせず、兄弟 Feature もインポートしません。

Clinic アーキテクチャ契約(iOS 26 / Swift 6.2)

このスキルのガイダンスはすべて、Clinic のモジュール化 MVVM-C アーキテクチャを前提としています。

  • Feature モジュールがインポートするのは Domain と DesignSystem のみです(Data および兄弟 Feature はインポートしません)。
  • App ターゲットが集約地点となり、DependencyContainer、具象コーディネーター、Route Shell の配線を所有します。
  • Domain は純粋な Swift を保ち、モデルに加えて、リポジトリ、*Coordinating、ErrorRouting、AppError の各コントラクトを定義します。
  • Data は SwiftData/ネットワーク/同期/再試行/バックグラウンド I/O を所有し、Domain プロトコルを実装します。
  • 読み書きのフローでは、デフォルトで stale-while-revalidate による読み取りと、楽観的なキュー書き込みを使用します。
  • ViewModel はリポジトリプロトコルを直接呼び出します(デフォルトのユースケース/インタラクターレイヤーはありません)。

適用する場面

次の場合に、これらのガイドラインを参照してください。

  • 非推奨の SwiftUI API(ObservableObject、NavigationView、古い onChange)から移行する
  • @Observable ViewModel を使用する状態管理に再構成する
  • パフォーマンス向上のため、ビューに @Equatable による差分検出を追加する
  • 大きなビューを、本文が最大 10 ノードになるように分割する
  • ナビゲーションをコーディネーター + Route Shell パターンにリファクタリングする
  • Domain/Data/Feature/App のパッケージ境界に沿ってリファクタリングする
  • DependencyContainer による依存性注入を設定する
  • リスト/コレクションのスクロールパフォーマンスを改善する
  • 手動の Task 管理を .task(id:) とキャンセル可能な読み込みに置き換える

必ず守る制約(iOS 26 / Swift 6.2)

  • ViewModel/コーディネーターには @Observable を使用し、ObservableObject/@Published は使用しません。
  • NavigationStack は App ターゲットの Route Shell とコーディネーターが所有します。
  • すべてのビューに @Equatable マクロを付け、AnyView は使用しません。
  • Domain がリポジトリ/コーディネーター/エラールーティングのプロトコルを定義し、フレームワークに依存する I/O は行いません。
  • 専用のユースケース/インタラクターレイヤーは設けません。ViewModel がリポジトリプロトコルを直接呼び出します。
  • ビューからリポジトリに直接アクセスしません。

優先度別ルールカテゴリ

優先度カテゴリ影響プレフィックスルール数
1ビューのアイデンティティと差分検出CRITICALdiff-4
2API の最新化CRITICALapi-7
3状態アーキテクチャCRITICALstate-6
4ビューの構成HIGHview-7
5ナビゲーションと調整HIGHnav-5
6レイヤーアーキテクチャHIGHlayer-5
7アーキテクチャパターンHIGHarch-5
8依存性注入MEDIUM-HIGHdi-2
9型安全性とプロトコルMEDIUM-HIGHtype-4
10リストとコレクションのパフォーマンスMEDIUMlist-4
11非同期処理とデータフローMEDIUMdata-3
12Swift 言語の基礎MEDIUMswift-8

クイックリファレンス

1. ビューのアイデンティティと差分検出(CRITICAL)
2. API のモダナイズ(CRITICAL)
3. 状態アーキテクチャ(CRITICAL)
4. ビューの構成(HIGH)
5. ナビゲーションと調整(HIGH)
6. レイヤーアーキテクチャ(HIGH)
  • layer-dependency-rule - フレームワークのインポートがないドメインレイヤーを切り出す
  • layer-usecase-protocol - ユースケース/インタラクターレイヤーを削除し、ViewModel とリポジトリプロトコルでオーケストレーションを行う
  • layer-repository-protocol - リポジトリプロトコルは Domain に、実装は Data に配置する
  • layer-no-view-repository - ビューからのリポジトリへの直接アクセスを削除する
  • layer-viewmodel-boundary - ViewModel を、表示用に整えた状態のみを公開するようリファクタリングする
7. アーキテクチャパターン(高)
8. 依存性注入(中〜高)
9. 型安全性とプロトコル(中〜高)
10. リストとコレクションのパフォーマンス(中)
  • list-constant-viewcount - ForEachが要素ごとに一定のビュー数を生成するようにします
  • list-filter-in-model - フィルター/ソートのロジックをForEachからViewModelに移します
  • list-lazy-stacks - 内容が無制限の場合はVStack/HStackをLazy版に置き換えます
  • list-id-keypath - 明示的なid keyPathを指定し、暗黙の識別性に依存しないようにします
11. 非同期処理とデータフロー(中)
  • data-task-modifier - onAppearでの非同期処理を.taskモディファイアに置き換えます
  • data-error-loadable - 読み込み状態をブール値フラグではなく列挙型で表します
  • data-cancellation - .taskの自動キャンセルを使用し、Taskを手動で管理しないようにします
12. Swift言語の基礎(中)

使用方法

詳しい説明とコード例については、個々のリファレンスファイルをお読みください。

リファレンスファイル

ファイル説明
references/_sections.mdカテゴリーの定義と順序
assets/templates/_template.md新しいルール用のテンプレート

コメント