appkit-interop について
SwiftUI だけでは足りない macOS ネイティブ機能を扱う開発者向けのスキルです。ビュー、ビューコントローラー、アプリレベルのフックから小さな AppKit ブリッジを選び、状態の所有権とライフサイクル境界を定めます。
主な機能
- 01要件に合う最小のブリッジ選択
- 02Representable による AppKit ビューのラップ
- 03ウィンドウ、メニュー、レスポンダーチェーンの処理
- 04SwiftUI と AppKit の状態境界の明確化
- 05コーディネーターとライフサイクル前提の確認
活用シーン
- 01SwiftUI への特定 AppKit コントロールの追加
- 02ウィンドウやパネルの動作実装
- 03メニュー検証とファーストレスポンダーの処理
- 04ドラッグ&ドロップやファイルパネルの追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ openai/ plugins --skill appkit-interopインストール後、Claude Code で/appkit-interopを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/drag-drop-pasteboard.mdrepresentables.mdresponder-menus.mdwindow-panels.md詳細
AppKit 相互運用
クイックスタート
SwiftUI ではネイティブ macOS の動作を実現しきれない場合に、このスキルを使用します。 ブリッジはできるだけ小さく、明示的に保ちます。通常は SwiftUI を真実の情報源とし、 AppKit は命令型の処理を担います。
最小限のブリッジを選ぶ
- 必要な動作がシーン、ツールバー、コマンド、インスペクタ、または標準コントロールですでに実現できる場合は、SwiftUI のみを使用します。
- ライフサイクル要件が軽微で、特定の AppKit ビューが必要な場合は、
NSViewRepresentableを使用します。 - コントローラのライフサイクル、デリゲーション、または表示の調整が必要な場合は、
NSViewControllerRepresentableを使用します。 NSWindow、レスポンダーチェーン、メニューの検証、パネル、またはアプリレベルの動作が必要な場合は、AppKit のウィンドウまたはアプリのフックを直接使用します。
ワークフロー
-
不足している機能を正確に特定します。
- ウィンドウの動作
- テキストシステムの動作
- メニューの検証
- ドラッグ&ドロップ
- ファイルを開く/保存するパネル
- ファーストレスポンダーの制御
-
解決に必要な最小限の境界を選びます。
- ラップしたコントロールやコーディネーターで対応できる場合は、画面全体を AppKit に移行しないでください。
-
所有権を明確にします。
- SwiftUI が値の状態、選択状態、監視可能なモデルを所有します。
- AppKit オブジェクトは、Representable、コーディネーター、またはブリッジオブジェクトの内部に保持します。
-
SwiftUI に戻すインターフェースを絞ります。
- 編集可能な状態にはバインディング
- イベントには小さなコールバック
- 必要な場合に限り、用途を絞ったブリッジサービス
-
ライフサイクルに関する前提を検証します。
- SwiftUI は Representable を再作成する場合があります。
- コーディネーターは、デリゲートやターゲット/アクションの連携を保持するためのものであり、第 2 のアプリケーションアーキテクチャではありません。
参考資料
references/representables.md:ビューラッパーとビューコントローララッパーの選択、およびコーディネーターパターンについて。references/window-panels.md:ウィンドウへのアクセス、ユーティリティウィンドウ、ファイルを開く/保存するパネルについて。references/responder-menus.md:ファーストレスポンダー、コマンドのルーティング、メニューの検証について。references/drag-drop-pasteboard.md:ペーストボード、ファイル URL、デスクトップでのドラッグ&ドロップに関する注意点について。
ガードレール
- SwiftUI と AppKit の間で真実の情報源を重複させないでください。
Coordinatorを、整理されていない処理の置き場にしないでください。- 明確な所有権上の理由がない限り、長期間存続する
NSViewやNSWindowのインスタンスをグローバルに保存しないでください。 - 機能を AppKit だけで書き直すより、小さくテスト済みのブリッジを優先してください。
- パターンを完全に
swiftui-patterns内に留められる場合は、そのままにしてください。
出力の要件
以下を提示してください。
- 対応する SwiftUI の具体的な制限
- 推奨する最小限のブリッジの種類
- SwiftUI と AppKit 間のデータフローの境界
- 注意すべきライフサイクルまたは検証上のリスク
コメント
Markdown 対応