swift-patterns について
swift-patterns は、SwiftUI 機能のレビュー、リファクタリング、新規実装を支援するコーディングエージェント向けスキルです。Apple のガイダンスに沿い、特定のアーキテクチャを強制せずに状態管理や API、ビュー構成、性能の指針を示します。
主な機能
- 01SwiftUI コードのレビュー
- 02既存機能のリファクタリング
- 03新機能実装のガイド
- 04SwiftUI のベストプラクティス案内
- 05状態・ナビゲーション・性能の確認
活用シーン
- 01プロパティラッパーと状態所有権の監査
- 02非推奨 SwiftUI API の置き換え
- 03複雑なビュー構成の整理
- 04リスト識別子と非同期タスクの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ efremidze/ swift-patterns-skill --skill swift-patternsインストール後、Claude Code で/swift-patternsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/code-review-refactoring.mdconcurrency.mdlists-collections.mdmodern-swiftui-apis.mdnavigation.mdpatterns.mdperformance.mdrefactor-playbooks.mdscrolling.mdstate.mdtesting-di.mdview-composition.mdworkflows-refactor.mdworkflows-review.md詳細
swift-patterns
適切な状態管理、最新の API の使用、最適なビュー構成、パフォーマンスを考慮したパターンに基づいて、SwiftUI の機能をレビュー、リファクタリング、または構築します。ネイティブ API、Apple のデザインガイダンス、テストしやすいコード構造を優先します。このスキルでは、特定のアーキテクチャパターンを強制せず、事実とベストプラクティスに焦点を当てます。
ワークフローの判断ツリー
1) 既存の SwiftUI コードをレビューする
→ レビュー方法については references/workflows-review.md を読みます
- プロパティラッパーの選択に照らして状態管理を確認します(
references/state.mdを参照) - ビューの構成と抽出のパターンを検証します(
references/view-composition.mdを参照) - リストのパフォーマンスと ID の安定性を監査します(
references/lists-collections.mdを参照) - 最新の API の使用状況を検証します(
references/modern-swiftui-apis.mdを参照) - .task を使った非同期処理のパターンを確認します(
references/concurrency.mdを参照) - ナビゲーションの実装を検証します(
references/navigation.mdを参照) - レビュー回答テンプレート(以下)を使用します
2) 既存の SwiftUI コードをリファクタリングする
→ リファクタリング方法については references/workflows-refactor.md を読みます
- プレイブックを使って複雑なビューを抽出します(
references/refactor-playbooks.mdを参照) - 非推奨 API を最新の代替 API に移行します(
references/modern-swiftui-apis.mdを参照) - パフォーマンス上のホットパスを最適化します(
references/performance.mdを参照) - 状態の所有権を再構成します(
references/state.mdを参照) - 一般的なパターンを適用します(
references/patterns.mdを参照) - リファクタリング回答テンプレート(以下)を使用します
3) 新しい SwiftUI 機能を実装する
- まずデータフローを設計します。所有する状態と注入される状態を特定します(
references/state.mdを参照) - 最適な構成になるようビューを構成します(
references/view-composition.mdを参照) - 最新の API のみを使用します(
references/modern-swiftui-apis.mdを参照) - .task 修飾子で非同期処理を扱います(
references/concurrency.mdを参照) - パフォーマンスパターンを早い段階で適用します(
references/performance.mdを参照) - ナビゲーションフローを実装します(
references/navigation.mdを参照)
4) ベストプラクティスに関する質問に答える
- トピックに応じて関連するリファレンスファイルを読み込みます(以下のリファレンスファイルを参照)
- 例を交えて、直接的なガイダンスを提示します
意図が不明確な場合は、次のように尋ねます:「確認結果のみを希望しますか(レビュー)、それともコードも変更しますか(リファクタリング)?」
回答テンプレート
レビュー回答:
- 対象範囲 - レビューした内容
- 確認事項 - 重要度別にまとめた、具体的な対応が可能な指摘
- 根拠 - ファイルパスまたはコードの位置
- リスクとトレードオフ - 破損する可能性がある箇所、または注意が必要な点
- 次のステップ - 最初に修正または検証する内容
リファクタリング回答:
- 意図と対象範囲 - 変更内容とその理由
- 変更点 - ファイルパスを含む箇条書き
- 動作の維持 - 変更後も維持されるべき動作
- 次のステップ - 必要なテストまたは検証
クイックリファレンス:プロパティラッパーの選択
| ラッパー | 使用する場面 | 所有者 |
|---|---|---|
@State | ビュー内部の状態(値型または @Observable クラス) | ビュー |
@Binding | 子ビューが親の状態を変更する必要がある場合 | 親ビュー |
@Bindable | バインディングを必要とする、注入された @Observable オブジェクト | 注入元 |
let | 親から渡される読み取り専用の値 | 注入元 |
var + .onChange() | リアクティブな更新が必要な読み取り専用の値 | 注入元 |
重要なルール:
@Stateは必ずprivateとして宣言します(所有権を明確にするため)- 渡された値に
@Stateを使用しないでください(初期値のみを受け取ります) @Observableクラスには@Stateを使用します(@StateObjectではありません)
詳しいガイダンスとトレードオフについては references/state.md を参照してください。
クイックリファレンス:最新 API への置き換え
| 非推奨 | 最新の代替手段 | 備考 |
|---|---|---|
foregroundColor() | foregroundStyle() | Dynamic Type に対応 |
cornerRadius() | .clipShape(.rect(cornerRadius:)) | より柔軟 |
NavigationView | NavigationStack | 型安全なナビゲーション |
tabItem() | Tab API | iOS 18 以降 |
onTapGesture() | Button | 位置や回数が必要な場合を除く |
onChange(of:) { value in } | onChange(of:) { old, new in } または onChange(of:) { } | パラメーターは 2 つ、または 0 個 |
UIScreen.main.bounds | GeometryReader またはレイアウト API | サイズのハードコーディングを回避 |
移行ガイドの全文は references/modern-swiftui-apis.md を参照してください。
レビューチェックリスト
SwiftUI コードのレビュー時に使用してください。
状態管理
-
@Stateプロパティにprivateを指定している - 渡された値を
@Stateまたは@StateObjectとして宣言していない - 子ビューが親の状態を変更する場合に限り
@Bindingを使用している - プロパティラッパーの選択が所有権のルールに従っている
- 状態の所有権が明確で、意図的に決められている
最新 API
- 非推奨の修飾子(foregroundColor、cornerRadius など)を使用していない
-
NavigationViewの代わりにNavigationStackを使用している - 適切な場合、
onTapGestureの代わりにButtonを使用している - 2 つのパラメーターを取る
onChange()またはパラメーターを取らないonChange()を使用している
ビューの構成
- 状態変更に条件分岐ではなく修飾子を使用している(アイデンティティを維持)
- 複雑なビューを個別のサブビューに切り出している
- ビューを小さく、焦点を絞ったものにしている
- ビューの
bodyをシンプルかつ純粋に保っている(副作用なし)
ナビゲーションとシート
- 型安全なナビゲーションに
navigationDestination(for:)を使用している - モデルに基づくシートに
.sheet(item:)を使用している - シートが自身の閉じる処理を所有している
リストとコレクション
-
ForEachで安定したアイデンティティを使用している(動的データに.indicesは使用しない) -
ForEachの各要素が常に一定数のビューを生成している -
ForEach内でインラインフィルタリングを行っていない(事前にフィルタリングしてキャッシュする) - リストの行で
AnyViewを使用していない
パフォーマンス
- ビューに必要な値だけを渡している(大きな設定オブジェクトは渡さない)
- 不要な依存関係を排除している
- 処理頻度の高い箇所では、状態を代入する前に値が変化したか確認している
- 大きなリストには
LazyVStack/LazyHStackを使用している - ビューの
body内でオブジェクトを生成していない
非同期処理
- 自動キャンセルのために
.taskを使用している - 値に依存するタスクには
.task(id:)を使用している - 非同期処理に
.onAppearを混在させていない
各項目の詳しい説明については、参考ファイルを参照してください。
制約
- Swift/SwiftUI のみを対象 - ブリッジが必要な場合を除き、サーバーサイド Swift と UIKit は対象外
- Swift の並行処理パターンは対象外 - SwiftUI の非同期処理には
.taskを使用 - アーキテクチャを強制しない - MVVM/MVC/VIPER や特定の構造を必須としない
- フォーマット/Lint のルールは対象外 - 正確性とパターンに重点を置く
- ツール固有のガイダンスは対象外 - Xcode、Instruments、IDE に関する手順は含めない
- 引用可能な資料:
developer.apple.com/documentation/swiftui/、developer.apple.com/documentation/swift/
すべてのワークフローで、これらの制約に従う必要があります。
基本方針
このスキルでは、Apple のドキュメントに基づく事実とベストプラクティスに重点を置きます。
- 非推奨の API より最新の API を優先
- 状態の所有権パターンを明確化
- パフォーマンスを意識したビュー構成
- テスト可能なコード構造
- アーキテクチャを強制しない(MVVM/VIPER は必須ではない)
- Apple Human Interface Guidelines に準拠
参照ファイル
references/ 内のすべての参照ファイル:
workflows-review.md- レビュー手法と指摘事項の分類体系workflows-refactor.md- リファクタリング手法と不変条件refactor-playbooks.md- 手順ごとのリファクタリングガイドstate.md- プロパティラッパーと所有権のパターンnavigation.md- ナビゲーションの実装パターンview-composition.md- ビューの構造と抽出lists-collections.md- 識別と ForEach のパターンscrolling.md- スクロール処理とページネーションconcurrency.md- .task による非同期処理performance.md- 最適化の戦略testing-di.md- テストと依存性注入patterns.md- SwiftUI の一般的なパターンmodern-swiftui-apis.md- レガシー API の移行code-review-refactoring.md- コード品質チェック