swiftui-expert-skill について
コーディングエージェント向けの SwiftUI スキルです。実装、レビュー、リファクタリング、Instruments のトレース分析を、トピック別の資料とチェック項目で支援します。
主な機能
- 01SwiftUI の実装とレビュー
- 02状態管理とビュー構成の指針
- 03パフォーマンスとアクセシビリティの確認
- 04Instruments のトレース記録と分析
活用シーン
- 01SwiftUI コードの非推奨 API の確認
- 02バージョン別フォールバックを備えたビューの作成
- 03.trace ファイルを使った性能調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill swiftui-expert-skillインストール後、Claude Code で/swiftui-expert-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/accessibility-patterns.mdanimation-basics.mdanimation-transitions.mdfocus-patterns.mdanimation-advanced.mdcharts.mdcharts-accessibility.mdimage-optimization.mdlatest-apis.mdlayout-best-practices.mdliquid-glass.mdmacos-scenes.mdlocalization.mdperformance-patterns.mdpreviews.mdmacos-window-styling.mdmacos-views.mdsheet-navigation-patterns.mdscroll-patterns.mdlist-patterns.mdsoft-deprecation.mdstate-management.mdtrace-recording.mdtrace-analysis.mdview-structure.mdtext-patterns.mdscripts/analyze_trace.pyscripts/instruments_parser/__init__.pycorrelate.pyevents.py詳細
SwiftUI Expert Skill
使用するタイミング
iOS または macOS 向けの SwiftUI コードを作成、レビュー、リファクタリングするときに使用します。状態管理と @Observable データフロー、ビューの合成と無効化/パフォーマンス、リストと ForEach の identity、environment の使用、ローカライズ、アニメーション、Liquid Glass の採用、移行などが含まれます。
運用ルール
- 非推奨 API を避けるため、すべてのタスクの開始時に
references/latest-apis.mdを参照する - ブリッジが必要な場合を除き、UIKit/AppKit のブリッジよりもネイティブの SwiftUI API を優先する
- 正確性とパフォーマンスに焦点を当てる。特定のアーキテクチャ(MVVM、VIPER など)を強制しない
- テスト容易性のためにビジネスロジックをビューから分離することを推奨するが、方法を必須にはしない
- Apple の Human Interface Guidelines と API 設計パターンに従う
- Liquid Glass はユーザーから明示的に要求された場合にのみ採用する(
references/liquid-glass.mdを参照) - パフォーマンス最適化は要件ではなく提案として提示する
- バージョン固有の API には
#availableによるゲーティングと適切なフォールバックを使用する
タスクワークフロー
既存の SwiftUI コードをレビューする
- レビュー対象のコードを読み、どのトピックが該当するかを特定する
- 非推奨 API を指摘する(
references/latest-apis.mdと比較する) - 該当する各トピックについて以下のトピックルーターを実行する
- iOS 26+ の機能に対する
#availableゲーティングとフォールバックパスを検証する
既存の SwiftUI コードを改善する
- 現在の実装をトピックルーターのトピックと照らし合わせて監査する
- 非推奨 API を
references/latest-apis.mdの最新の同等 API に置き換える - ホットパスをリファクタリングして不要な状態更新を減らす
- 複雑なビューボディを別々のサブビューに抽出する
UIImage(data:)を見つけたら画像のダウンサンプリングを提案する(任意の最適化。references/image-optimization.mdを参照)
新しい SwiftUI 機能を実装する
- まずデータフローを設計する:所有される状態と注入される状態を特定する
- 最適な差分検出のためにビューを構造化する(早い段階でサブビューを抽出する)
- 正しいアニメーションパターンを適用する(暗黙的と明示的、トランジション)
- タップ可能なすべての要素に
Buttonを使用する。アクセシビリティのグループ化とラベルを追加する - バージョン固有の API を
#availableでゲートし、フォールバックを提供する
新しい Instruments トレースを記録する
ユーザーが「トレースを記録する」「アプリをプロファイリングする」「セッションをキャプチャする」などを求めたときにトリガーします。完全なリファレンス:references/trace-recording.md。
- ターゲットを確認する — 実行中のアプリにアタッチするか、アプリを起動するか、すべてのプロセスを記録するか?ユーザーが指定していない場合は尋ねてください。必要に応じて接続されているデバイスを一覧表示します:
python3 "${SKILL_DIR}/scripts/record_trace.py" --list-devices - ターゲットの種類に基づいてテンプレートを選ぶ —
SwiftUIテンプレートは、任意の実機(物理的な iOS/iPadOS デバイスまたはホスト Mac)で SwiftUI レーンにデータを収集します。唯一の例外は iOS シミュレータで、この場合は SwiftUI レーンが空で返るため、--template "Time Profiler"に切り替えます(それでも Time Profiler + Hangs + Animation Hitches が得られます)。常に--list-devicesを確認してください:simulatorsの種類 →Time Profiler、devicesの種類(実機とホスト Mac)→ デフォルトのSwiftUI。完全な判断表はreferences/trace-recording.mdにあります。 - 記録を開始する。ユーザーが「終わったら知らせる」と言うエージェント駆動のセッションでは、バックグラウンドで開始し、ストップファイルを使用します:
インタラクティブなセッションでは、終了時に Ctrl+C を押すようユーザーに伝えるだけで十分です。python3 "${SKILL_DIR}/scripts/record_trace.py" \ --device "<name|udid>" --attach "<AppName>" \ --stop-file /tmp/stop-trace --output ~/Desktop/session.trace - 停止を通知する — ユーザーがアプリの操作を終えたと言ったら、
touch /tmp/stop-traceを実行します。スクリプトは xctrace にクリーンに SIGINT を送り、最大 60 秒間ファイナライズを待ちます。 - 結果のトレースを分析する(以下の「トレース駆動の改善」ワークフローに進みます)。
トレース駆動の改善(Instruments の .trace を提供)
ユーザーのリクエストが .trace ファイルを参照したときは常にトリガーします。対象となる SwiftUI ソースファイルは任意です。指定された場合は具体的な行を引用し、指定されていない場合はトレースがすでに明らかにしているビュー名とシンボルに基づいて、どこを確認すべきかを提案します。
完全なリファレンス: references/trace-analysis.md。構成パターンの概要:
- 分析の範囲を決める。 自問してください: ユーザーはトレース全体を求めているのか、それとも一部を求めているのか?
- 「X に注目」「X の後」「X と Y の間」「X の間」→ まずウィンドウに解決する(ステップ 2 を参照)。
- 範囲指定の手がかりがない → トレース全体を分析する。
- ウィンドウを解決する(ユーザーが範囲を指定した場合のみ)。 パーサーは 2 つの検出モードを公開しています:
どちらのモードも# Find a log that marks the start/end of the region of interest: python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <path> \ --list-logs --log-message-contains "loaded feed" --log-limit 5 # Or list os_signpost intervals (paired begin/end), filterable by name: python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <path> \ --list-signposts --signpost-name-contains "ImageDecode"--window START_MS:END_MSを受け付け、検出の範囲を限定します。ユーザーの説明に合致するtime_ms(ログの場合)またはstart_ms/end_ms(signpost の場合)を選びます。--window 10400:11700のようなウィンドウを構築します。 - メイン分析を実行する(
--windowの有無を問わず):python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <path> \ --json-only --top 10 [--window START_MS:END_MS] references/trace-analysis.mdを使って解釈する — 主要な診断項目:- 各 correlation 内の
main_running_coverage_pct(<25% = ブロックされている; ≥75% = CPU バウンド)。 swiftui-causes.top_sourcesは、なぜ更新が繰り返し発生し続けるのかを明らかにします —UserDefaultObserver.send()のようなエッジ数の多いソースや、幅の広いEnvironmentWriterのエントリは構造的な無効化バグです。1 つを修正すると、多くの下流のホットビューがまとめて解消されることがよくあります。
- 各 correlation 内の
- 特定のビューが高コストとして現れたら、誰がそれを無効化しているのかを問う。
--fanin-for "<view name>"を使うと、更新を引き起こしているソースノードのランキングリストを取得できます。 - 任意でソースに基づいて根拠づける。 ユーザーがファイルを指定した場合は、それを読み、ビュー名やユーザーコードのシンボルをその中の識別子と照合します。指定していない場合は、SwiftUI が報告したビュー名に基づいて、どのファイルを開くべきかを提案します。
- 優先順位付けされた計画を返す。 根拠(カバレッジ率、ホットシンボル、重複するビュー、ログのタイムスタンプ、原因グラフのエッジ)を引用し、各推奨事項を Topic Router のリファレンスにルーティングします。
- ユーザーが編集を求めた場合にのみコードを編集します。
Topic Router
現在のタスクに関連する各トピックについて、リファレンスファイルを参照してください:
| トピック | リファレンス |
|---|---|
| 状態管理 | references/state-management.md |
| ビューの構成 | references/view-structure.md |
| パフォーマンス | references/performance-patterns.md |
| リストと ForEach | references/list-patterns.md |
| レイアウト | references/layout-best-practices.md |
| シートとナビゲーション | references/sheet-navigation-patterns.md |
| ScrollView | references/scroll-patterns.md |
| フォーカス管理 | references/focus-patterns.md |
| アニメーション(基本) | references/animation-basics.md |
| アニメーション(トランジション) | references/animation-transitions.md |
| アニメーション(応用) | references/animation-advanced.md |
| アクセシビリティ | references/accessibility-patterns.md |
| Swift Charts | references/charts.md |
| Charts のアクセシビリティ | references/charts-accessibility.md |
| 画像の最適化 | references/image-optimization.md |
| Liquid Glass(iOS 26+) | references/liquid-glass.md |
| macOS のシーン | references/macos-scenes.md |
| macOS のウィンドウスタイリング | references/macos-window-styling.md |
| macOS のビュー | references/macos-views.md |
| テキストのパターン | references/text-patterns.md |
| ローカライゼーション | references/localization.md |
| 非推奨 API の検索 | references/latest-apis.md |
| ソフト非推奨 API の扱い | references/soft-deprecation.md |
| プレビュー | references/previews.md |
| Instruments トレース分析 | references/trace-analysis.md |
| Instruments トレース記録 | references/trace-recording.md |
正確性チェックリスト
これらは厳格なルールです -- 違反は常にバグです:
-
@Stateプロパティはprivateである -
@Bindingは子ビューが親の状態を変更する場合にのみ使用する - 渡された値が
@Stateや@StateObjectとして宣言されていない (これらは更新を無視します) - ビューが所有するオブジェクトには
@StateObject、注入されたオブジェクトには@ObservedObjectを使用する - iOS 17 以降:
@Observableと共に@Stateを使用する; バインディングが必要な注入された Observable には@Bindableを使用する -
ForEachは安定した ID を使用する (.indices/\.offsetは決して使用しない; id はビューより長く存続し、可変コンテンツから派生していないこと) -
ForEachの各要素あたりのビュー数が一定である;Listの行は単一である - カスタムの
@Environment/@FocusedValueキーにクロージャが保存されていない - カスタム
@Entryのデフォルト値が安定している (Model()/Date()/UUID()式を使用していない) -
.animation(_:value:)には常にvalueパラメータが含まれている -
@FocusStateプロパティはprivateである -
.focusable()ビューのタップジェスチャハンドラ内で冗長な@FocusStateの書き込みがない - iOS 26 以降の API は
#availableでゲートされ、フォールバックが提供されている - チャート型を使用するファイルに
import Chartsが存在する - プレビューは自己完結型のモックデータを使用している; ライブサービスやネットワークに依存していない
リファレンス
references/latest-apis.md-- すべてのタスクで最初に読んでください。 非推奨からモダンへの API の移行 (iOS 15+ から iOS 26+ まで)references/state-management.md-- プロパティラッパー、データフロー、@Observableへの移行references/view-structure.md-- ビューの抽出、コンテナパターン、@ViewBuilderreferences/performance-patterns.md-- ホットパスの最適化、更新の制御、_logChanges()references/list-patterns.md-- ForEach の identity、Table (iOS 16+)、インラインフィルタリングの落とし穴references/layout-best-practices.md-- レイアウトパターン、GeometryReader の代替references/accessibility-patterns.md-- VoiceOver、Dynamic Type、グループ化、traitsreferences/animation-basics.md-- 暗黙的/明示的アニメーション、タイミング、パフォーマンスreferences/animation-transitions.md-- ビューのトランジション、matchedGeometryEffect、Animatablereferences/animation-advanced.md-- フェーズ/キーフレームアニメーション (iOS 17+)、@Animatableマクロ (iOS 26+)references/charts.md-- Swift Charts のマーク、軸、選択、スタイリング、Chart3D (iOS 26+)references/charts-accessibility.md-- Charts の VoiceOver、Audio Graph、フォールバック戦略references/sheet-navigation-patterns.md-- シート、NavigationSplitView、Inspectorreferences/scroll-patterns.md-- ScrollViewReader、プログラムによるスクロールreferences/focus-patterns.md-- フォーカス状態、フォーカス可能なビュー、フォーカス値、デフォルトフォーカス、よくある落とし穴references/image-optimization.md-- AsyncImage、ダウンサンプリング、キャッシュreferences/liquid-glass.md-- iOS 26+ の Liquid Glass エフェクトとフォールバックパターンreferences/macos-scenes.md-- Settings、MenuBarExtra、WindowGroup、マルチウィンドウreferences/macos-window-styling.md-- ツールバースタイル、ウィンドウサイズ、Commandsreferences/macos-views.md-- HSplitView、Table、PasteButton、AppKit 相互運用references/previews.md--#Previewマクロ、@Previewable(iOS 18+)、プレビューの traits、自己完結型プレビュー用のモックデータパターンreferences/text-patterns.md-- Text イニシャライザの選択、verbatim とローカライズの比較references/localization.md-- String Catalogs、パッケージ用の#bundle、LocalizedStringResource、ロケール対応のフォーマット、RTL レイアウト、翻訳者コメントreferences/soft-deprecation.md-- ソフト非推奨の API に対する振る舞い (いつ移行すべきか、スコープのルール、無関係な編集の際には移行しない)references/trace-analysis.md--scripts/analyze_trace.pyで Instruments の.traceファイルを解析します。メインスレッドのカバレッジ、高重要度の SwiftUI 更新、ヒッチの説明を解釈し、検出結果をソースファイルに紐付けますreferences/trace-recording.md--scripts/record_trace.pyで新しいトレースを記録します。実行中のアプリにアタッチする、新規に起動する、手動で停止したセッションをキャプチャする、といったことが可能です。エージェント駆動のフロー向けの stop-file もサポートします
制限事項
- このスキルは、タスクがその上流ソースとローカルプロジェクトのコンテキストに明確に一致する場合にのみ使用してください。
- 変更を適用する前に、コマンド、生成されたコード、依存関係、認証情報、外部サービスの動作を確認してください。
- 破壊的または高コストな操作については、例を環境固有のテスト、セキュリティレビュー、ユーザーの承認の代わりとして扱わないでください。