mcpField
S
swiftui-patterns

swiftui-patterns

github.com/johnrogers開発233260 回インストール41 週間前に更新
リポジトリ

swiftui-patterns について

swiftui-patternsは、iOS 17以降のSwiftUI開発者向けリファレンススキルです。状態、環境、ナビゲーション、非同期処理に使う最新のApple APIと、よくある問題を案内します。

主な機能

  1. 01iOS 17以降の状態と環境のパターン
  2. 02.taskによる非同期処理
  3. 03NavigationStackとNavigationPathのガイダンス
  4. 04アクセシビリティとUIKit連携の案内

活用シーン

  1. 01SwiftUIモデルの状態ラッパーの選択
  2. 02iOS 16のパターンからiOS 17以降への移行
  3. 03非同期読み込みとナビゲーションの実装
  4. 04アクセシビリティやUIKitラッパーの確認

インストール

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

$npx skills add https://github.com/johnrogers/claude-swift-engineering --skill swiftui-patterns

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

同梱ファイル

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

references/
accessibility.md
async-patterns.md
composition.md
environment.md
migration-guide.md
mvvm-observable.md
navigation.md
observable.md
performance.md
state-management.md
uikit-interop.md
view-modifiers.md

詳細

SwiftUI パターン(iOS 17 以降)

SwiftUI 17 以降では、@Observable によって ObservableObject の定型コードが不要になり、@Environment によって環境への注入が簡素化され、タスクベースの非同期パターンが導入されています。基本原則は、リアクティブライブラリではなく Apple の最新 API を使うことです。

概要

クイックリファレンス

必要なもの使用するもの(iOS 17 以降)使用しないもの
Observable モデル@ObservableObservableObject
Published プロパティ通常のプロパティ@Published
所有する状態@State@StateObject
渡されたモデル(バインディング)@Bindable@ObservedObject
環境への注入environment(_:)environmentObject(_:)
環境へのアクセス@Environment(Type.self)@EnvironmentObject
表示時の非同期処理.task { }.onAppear { Task {} }
値の変更onChange(of:initial:_:)onChange(of:perform:)

基本的なワークフロー

  1. モデルクラスには @Observable を使います(@Published は不要です)
  2. ビューが所有するモデルには @State、渡されたモデルには @Bindable を使います
  3. 非同期処理には .task { } を使います(ビューが消えると自動的にキャンセルされます)
  4. プログラムによるナビゲーションには、NavigationPath と NavigationStack を使います
  5. インタラクティブな要素には .accessibilityLabel() と .accessibilityHint() を適用します

リファレンスの読み込みガイド

内容が必要になる可能性が少しでもある場合は、必ずリファレンスファイルを読み込んでください。 パターンを見落としたり、間違いを犯したりするより、事前にコンテキストを把握しておくほうが適切です。

リファレンス読み込むタイミング
Observable新しい @Observable モデルクラスを作成するとき
状態管理@State、@Bindable、@Environment のどれを使うか判断するとき
環境ビュー階層に依存関係を注入するとき
ビュー修飾子onChange、task、または iOS 17 以降の修飾子を使うとき
移行ガイドiOS 16 のコードを iOS 17 以降に更新するとき
MVVM Observableビューモデルのアーキテクチャを設定するとき
ナビゲーションプログラムによるナビゲーションまたはディープリンクを実装するとき
パフォーマンス100 件を超える項目を含むリストや、過剰な再描画に対処するとき
UIKit 連携UIKit コンポーネント(WKWebView、PHPicker)をラップするとき
アクセシビリティVoiceOver、Dynamic Type、アクセシビリティアクションを扱うとき
非同期パターン読み込み状態、更新、バックグラウンドタスクを扱うとき
コンポジション再利用可能なビュー修飾子や複雑な条件付き UI を扱うとき

よくある間違い

  1. 渡されたモデルに @Bindable を使いすぎる — すべてのプロパティに @Bindable を作成すると、不要なビューの再読み込みが発生します。双方向バインディングが必要な変更可能なモデルプロパティにのみ @Bindable を使います。読み取り専用の計算プロパティには通常のプロパティを使います。

  2. 状態を配置する場所の誤り — 専用の @Observable モデルではなくビューにモデルの状態を置くと、ビューのロジックが複雑に絡み合います。モデルとビューの関心事は必ず分離してください。

  3. NavigationPath の状態破損 — NavigationPath を誤って変更すると、一貫性のない状態になることがあります。パスの破損を防ぐため、適切な状態管理とともに navigationDestination(for:destination:) を使います。

  4. .task のキャンセル漏れ — .task はビューが消えたときに自動でキャンセルしますが、ネストされた Task は対象外です。複雑な非同期処理フローでは、ゾンビタスクを防ぐために明示的なキャンセル追跡が必要です。

  5. 環境の無効化を無視する — 親で環境値を変更しても、子ビューが自動的に無効化されるわけではありません。@Environment を一貫して使い、観測に基づいて再描画が発生するタイミングを理解してください。

  6. UIKit 連携によるメモリリーク — デリゲートの循環参照を解消しないと、UIViewRepresentable と UIViewControllerRepresentable でメモリリークが発生することがあります。弱参照と明示的なクリーンアップが必要です。

コメント