swift-concurrency
Swiftの並行処理に関する問題を診断し、コールバックベースのコードをasync/awaitに書き換えます。タスク、アクター、@MainActor、Sendable、データ競合、スレッド安全性、並行処理に関するコンパイラ・リンター警告など、Swift 6移行のガイドも提供します。
description の原文を見る
Diagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or concurrency-related compiler and linter warnings.
SKILL.md 本文
Swift Concurrency
Fast Path
修正案を提案する前に:
Package.swiftまたは.pbxprojを分析して、Swift 言語モード、厳密な並行処理レベル、デフォルト分離、および今後の機能を決定します。これはマイグレーション作業だけでなく、常に行ってください。- 正確な診断と対象のシンボルをキャプチャします。
- 分離境界を決定します:
@MainActor、カスタムアクタ、アクタインスタンス分離、またはnonisolated。 - コードが UI バウンドであるか、メインアクタの外で実行される予定であるかを確認します。構造化されていないタスクを生成する場合、同期プレフィックス (最初の
awaitまでのすべて) を検査します: メインアクタアクセスが必ずしも必要でない場合は、@MainActorから開始するのではなくTask { @concurrent in ... }を使用し、サスペンション後にのみMainActor.runでホップバックします。重要でない非メインラインの後に同じプレフィックス内でメインアクタ作業が続く場合 (例:print)、@concurrentを使用する理由はありません。遅延再試行、タイマー、バックオフタスクの場合は、待機と UI ミューテーションを分離します。スリープは、最終的な状態更新がメインアクタに属する場合でも、メインアクタの外にあることがよくあります。
並行処理の動作を変更するプロジェクト設定:
| 設定 | SwiftPM (Package.swift) | Xcode (.pbxproj) |
|---|---|---|
| 言語モード | swiftLanguageVersions または -swift-version (// swift-tools-version: は信頼できるプロキシではありません) | Swift Language Version |
| 厳密な並行処理 | .enableExperimentalFeature("StrictConcurrency=targeted") | SWIFT_STRICT_CONCURRENCY |
| デフォルト分離 | .defaultIsolation(MainActor.self) | SWIFT_DEFAULT_ACTOR_ISOLATION |
| 今後の機能 | .enableUpcomingFeature("NonisolatedNonsendingByDefault") | SWIFT_UPCOMING_FEATURE_* |
これらのいずれかが不明な場合は、マイグレーションに敏感なガイダンスを提供する前に開発者に確認するよう求めてください。推測しないでください。
ガードレール:
@MainActorをブランケット修正として推奨しないでください。コードが本当に UI バウンドである理由を正当化します。- 構造化された並行処理を構造化されていないタスクよりも優先します。
Task.detachedは明確な理由がある場合にのみ使用します。 @preconcurrency、@unchecked Sendable、またはnonisolated(unsafe)を推奨する場合は、ドキュメント化された安全性不変量とフォローアップ削除計画が必要です。- 最小限の安全な変更のために最適化します。マイグレーション中に無関係なアーキテクチャをリファクタリングしないでください。
- コースリファレンスはより深い学習用のみです。慎重に使用し、開発者の質問に答えるのに本当に役立つ場合のみ使用します。
Quick Fix Mode
以下のすべてが当てはまる場合は Quick Fix Mode を使用します:
- 問題は 1 つのファイルまたは 1 つのタイプに限定されています。
- 分離境界は明確です。
- 修正は 1〜2 の動作保持ステップで説明できます。
以下のいずれかが当てはまる場合は Quick Fix Mode をスキップします:
- ビルド設定またはデフォルト分離が不明です。
- 問題がモジュール境界を越えるか、パブリック API の動作を変更します。
- 可能性の高い修正は安全でないエスケープハッチに依存しています。
Common Diagnostics
| 診断 | まず確認すること | 最小限の安全な修正 | エスカレーション先 |
|---|---|---|---|
Main actor-isolated ... cannot be used from a nonisolated context | これは本当に UI バウンドですか? | 呼び出し元を @MainActor に分離するか、メインアクタの所有権が正しい場合にのみ await MainActor.run { ... } を使用します。 | references/actors.md, references/threading.md |
Actor-isolated type does not conform to protocol | 要件はアクタ上で実行する必要がありますか? | 分離されたコンフォーマンスを優先します (例: extension Foo: @MainActor SomeProtocol)。nonisolated は本当に分離されていない要件にのみ使用します。 | references/actors.md |
Sending value of non-Sendable type ... risks causing data races | どの分離境界が越えられていますか? | アクセスを 1 つのアクタ内に保つか、転送された値を不変/値型に変換します。 | references/sendable.md, references/threading.md |
SwiftLint async_without_await | async はプロトコル、オーバーライド、または @concurrent によって実際に必要ですか? | async を削除するか、理由付きで狭い抑制を使用します。偽の await を追加しないでください。 | references/linting.md |
wait(...) is unavailable from asynchronous contexts | これはレガシー XCTest 非同期待機ですか? | await fulfillment(of:) または Swift Testing 相当品に置き換えます。 | references/testing.md |
| Core Data 並行処理警告 | NSManagedObject インスタンスがコンテキストやアクタを越えていますか? | NSManagedObjectID を渡すか、Sendable 値型にマップします。 | references/core-data.md |
Thread.current unavailable from asynchronous contexts | スレッドによるデバッグをしていますか、分離によってデバッグしていますか? | 分離の観点から推論し、Instruments/デバッガを代わりに使用します。 | references/threading.md |
| SwiftLint 並行処理関連警告 | どの特定のリントルールがトリガーされましたか? | references/linting.md をルール意図と優先修正に使用します。ダミー await は避けてください。 | references/linting.md |
When Quick Fixes Fail
- まだ確認されていない場合はプロジェクト設定を収集します。
- タイプが越える分離境界を再評価します。
- より深い修正については、一致するリファレンスファイルにルーティングします。
- 修正が動作を変更する可能性がある場合は、不変量をドキュメント化し、検証ステップを追加します。
Smallest Safe Fixes
データレース安全性を満たしながら動作を保持する変更を優先します:
- UI バウンド状態: タイプまたはメンバを
@MainActorに分離します。 - 共有可変状態: アクタの後ろに移動するか、状態が UI 所有の場合のみ
@MainActorを使用します。 - バックグラウンド作業: 作業が呼び出し元分離からホップオフする必要がある場合、
@concurrentでマークされたasyncAPI を使用します。作業が呼び出し元分離を安全に継承できる場合、@concurrentなしでnonisolatedを使用します。Taskを生成する場合、エントリ分離をその同期プレフィックスと一致させます。最初のawaitの前に何もメインアクタが必要ない場合、Task { @concurrent in ... }を使用し、UI 更新はawait MainActor.run { ... }経由でホップバックします。プレフィックスが重要でない非メインステートメントとメインアクタ作業を混ぜている場合は、継承された@MainActorスタートを保持します。安価なラインを offmain に分割することは余分なホップの価値がありません。 - Sendability の問題:
@unchecked Sendableよりも不変値と明示的な境界を優先します。
Concurrency Tool Selection
| 必要なもの | ツール | キーガイダンス |
|---|---|---|
| 単一の非同期操作 | async/await | 順序付き非同期作業のデフォルト選択 |
| 固定並列操作 | async let | コンパイル時に既知の数。スロー時に自動キャンセル |
| 動的並列操作 | withTaskGroup | 未知の数。構造化 — スコープ終了時に子をキャンセル |
| 同期 → 非同期ブリッジ | Task { } | アクタコンテキストを継承します。ドキュメント化された理由がある場合のみ Task.detached を使用 |
| 共有可変状態 | actor | ロック/キューより優先。分離セクションを小さく保つ |
| UI バウンド状態 | @MainActor | 本当に UI 関連のコードの場合のみ。分離を正当化します |
Common Scenarios
UI 更新を含むネットワークリクエスト
Task { @concurrent in
let data = try await fetchData()
await MainActor.run { self.updateUI(with: data) }
}
配列アイテムを並列で処理
await withTaskGroup(of: ProcessedItem.self) { group in
for item in items {
group.addTask { await process(item) }
}
for await result in group {
results.append(result)
}
}
Task entry isolation
Task のエントリ分離をその同期プレフィックス ({ から最初の await まで) と一致させます。
- プレフィックス内に
@MainActorが必要なものがあれば、継承された@MainActorスタートを保持します。 - プレフィックス内に
@MainActorが必要なものがなければ、Task { @concurrent in ... }を優先し、UI 所有のミューテーションに対してのみホップバックします。
// ❌ 同期プレフィックスは空です。最初の作業がホップオフします
Task {
await hopToOtherIsolationDomain()
}
// ❌ 同期プレフィックスは `print` のみ (重要でない、非メイン)。最初の await がホップオフします
Task {
print("Also not main-thread-bound")
await hopToOtherIsolationDomain()
}
// ✅ メインアクタの外で開始し、UI 作業に対してのみホップバック
Task { @concurrent in
await hopToOtherIsolationDomain()
await MainActor.run { updateUI() }
}
// ✅ 同期プレフィックスはメインアクタ作業を含みます — 継承を保持
Task {
print("debug") // 重要でない、非メイン — 乗り込む
self.isLoading = true // @MainActor が必要、任意の await の前
await fetchData()
}
Swift 6 Migration Quick Guide
Swift 6 の主な変更:
- 厳密な並行処理チェック がデフォルトで有効
- 完全なデータレース安全性 コンパイル時に
- Sendable 要件 境界に強制
- 分離チェック すべての非同期境界に対して
Migration Validation Loop
各マイグレーション変更に対してこのサイクルを適用します:
- ビルド —
swift buildまたは Xcode ビルドを実行して新しい診断を表示します - 修正 — 一度に 1 つのエラーカテゴリに対処します (例: 最初にすべての Sendable 問題)
- リビルド — 修正がクリーンにコンパイルされることを確認してから先に進みます
- テスト — テストスイートを実行してリグレッションをキャッチします (
swift testまたは Cmd+U) - 次に進む前に すべての診断が解決されるまで、ファイル/モジュール内で
修正が新しい警告を導入する場合、それらを続行する前に解決します。複数の無関係な修正を決してバッチ処理しないでください — コミットを小さく、レビュー可能に保ちます。
詳細なマイグレーション手順については、references/migration.md を参照してください。
Reference Router
質問に一致する最小のリファレンスを開きます:
- 基礎
references/async-await-basics.md— async/await 構文、実行順序、async let、URLSession パターンreferences/tasks.md— Task ライフサイクル、キャンセル、優先度、タスクグループ、構造化 vs 構造化されていないreferences/actors.md— アクタ分離、@MainActor、グローバルアクタ、再入性、カスタムエグゼキューター、Mutexreferences/sendable.md— Sendable コンフォーマンス、値/参照型、@unchecked、リージョン分離references/threading.md— 実行モデル、サスペンションポイント、Swift 6.2 分離動作
- ストリーム
references/async-sequences.md— AsyncSequence、AsyncStream、通常の非同期メソッドと使用時期references/async-algorithms.md— デバウンス、スロットル、マージ、combineLatest、チャネル、タイマー
- 応用トピック
references/testing.md— Swift Testing 優先、XCTest フォールバック、リークチェックreferences/performance.md— Instruments でのプロファイリング、サスペンションポイント削減、実行戦略references/memory-management.md— タスク内の保持サイクル、メモリ安全パターンreferences/core-data.md— NSManagedObject sendability、カスタムエグゼキューター、分離競合
- マイグレーションおよびツール
references/migration.md— Swift 6 マイグレーション戦略、クロージャから非同期への変換、@preconcurrency、FRP マイグレーションreferences/linting.md— 並行処理に焦点を当てたリントルールと SwiftLintasync_without_await
- 用語集
references/glossary.md— コア並行処理用語の簡単な定義
Verification Checklist
並行処理コードを変更する場合:
- 診断を解釈する前にビルド設定を再確認します。
- ビルドし、1 つのエラーカテゴリをクリアしてから先に進みます。無関係な修正を同じ変更にバッチ処理しないでください。
- テストを実行します。特にアクタ、ライフタイム、キャンセル感度テスト。
- 推測する代わりに Instruments を使用してパフォーマンスクレームを検証します。
- 長命タスクの割り当て解除とキャンセル動作を検証します。
- 長実行操作で
Task.isCancelledをチェックします。 - アクタ分離または
Mutexがより安全に所有権を表現する場合、非同期コンテキストでセマフォやアドホックロックを使用しないでください。
注: このスキルは、Antoine van der Lee による包括的な Swift Concurrency Course に基づいています。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- avdlee
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/avdlee/swift-concurrency-agent-skill / ライセンス: MIT
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。