mcpField
M
modern-swift

modern-swift

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

modern-swift について

Swift 6.2 と厳格なコンパイル時チェックを導入する開発者向けの、モダンな Swift 並行処理ガイドです。async/await、アクター、タスクグループ、キャンセル、旧パターンからの移行を解説します。

主な機能

  1. 01async/await による並行処理パターン
  2. 02共有可変状態を扱うアクター
  3. 03タスクグループとキャンセル処理
  4. 04厳格な並行性チェックと Sendable の指針
  5. 05従来の並行処理パターンからの移行

活用シーン

  1. 01完了ハンドラーを async/await に置き換える
  2. 02ロックを使わず共有状態を管理する
  3. 03非同期処理を並列実行する
  4. 04厳格な並行性チェックを有効にして Sendable エラーに対処する

インストール

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

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

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

同梱ファイル

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

references/
concurrency-essentials.md
macros.md
migration-patterns.md
modern-attributes.md
strict-concurrency.md
swift6-concurrency.md
task-cancellation.md
task-groups.md

詳細

モダンな Swift(6.2 以降)

Swift 6.2 では、async/await、アクター、Sendable 制約を使った厳密なコンパイル時並行性チェックが導入され、データ競合を実行時ではなくコンパイル時に防止します。これが、安全な並行処理を実現する Swift の基盤です。

概要

モダンな Swift は、従来の並行処理パターン(完了ハンドラー、DispatchQueue、ロック)を、コンパイラーが強制する安全性に置き換えます。基本原則は、厳密な並行性チェックを有効にしてコンパイルできるコードには、データ競合がないということです。

クイックリファレンス

必要なこと使用するもの使用しないもの
非同期処理async/await完了ハンドラー
メインスレッドでの処理@MainActorDispatchQueue.main
共有される可変状態actorロック、シリアルキュー
並列タスクTaskGroupDispatchGroup
スレッドセーフティSendableどこでも使う @unchecked

基本的なワークフロー

非同期の Swift コードを記述するときは、次の手順に従います。

  1. 非同期関数に async を付け、await で呼び出します
  2. ビューモデルと UI を更新するコードに @MainActor を適用します
  3. 共有される可変状態には、ロックではなく actor を使用します
  4. ループ内で Task.isCancelled を確認するか、Task.checkCancellation() を呼び出します
  5. コンパイル時の安全性を確保するため、Package.swift で厳密な並行性チェックを有効にします

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

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

リファレンス読み込むタイミング
Concurrency Essentials非同期コードの記述、完了ハンドラーの変換、await の使用時
Swift 6 Concurrency@concurrent、nonisolated(unsafe)、またはアクターパターンの使用時
Task Groups複数の非同期処理を並列実行する時
Task Cancellation長時間実行される処理やキャンセル可能な処理を実装する時
Strict ConcurrencySwift 6 の厳密モードを有効にする時、または Sendable エラーを修正する時
Macros@Observable などの Swift マクロを使用または理解する時
Modern Attributesレガシーコードの移行時、または @preconcurrency、@backDeployed の使用時
Migration Patternsデリゲートパターンや UIKit ビューをモダン化する時

よくある間違い

  1. 手っ取り早い修正としての @unchecked Sendable — コンパイラーエラーを抑えるために @unchecked Sendable を使うと、安全性を放棄したことになります。@unchecked を付けてもエラーが残る場合、コードにデータ競合が発生する可能性があります。根本的な問題を修正してください。

  2. 呼び出し箇所での await の付け忘れ — 非同期関数の呼び出し時に await を忘れるとコンパイラーエラーになります。一方、ループ内で Task.checkCancellation() を呼び出さずに Task.isCancelled を確認しても、キャンセルは黙って無視されます。

  3. weak を使わずに非同期ブロックで self をキャプチャする — 長時間実行される非同期タスクで self への強参照を保持すると、deinit が実行されなくなります。クロージャーでは必ず [weak self] を使うか、ライフサイクルを自動管理する .task を使用してください。

  4. タスクのキャンセルを確認しない — 長時間実行される処理では、定期的に Task.isCancelled を確認するか、Task.checkCancellation() を呼び出してください。そうしないと、キャンセルシグナルは無視されます。

  5. UI コードとテストスイートに @MainActor を付け忘れる — @Published プロパティを更新するメインのテスト構造体とビューモデルには @MainActor が必要です。付け忘れると、スレッドをまたいだ変更が黙って許可されます。ビューモデル、ビュー構造体、メインのテスト構造体、および UI に触れるすべての型に @MainActor を適用してください。

  6. アクターのリエントラント性による予期しない動作 — アクターメソッド内の await は、一時的にロックを解放することがあります。その間に別のタスクがアクターの状態を変更する可能性があります。await の各箇所の間で状態が変化する可能性を前提に、アクターメソッドを設計してください。

コメント