Swift 6から本格的に導入された Strict Concurrency Checking は、アプリの安定性を飛躍的に向上させる一方、既存のコードの移行や、並行処理を初めて学ぶ開発者にとってはハードルが高いという課題がありました。
この課題に対応するため、Swift 6.2では「Approachable Concurrency」というビジョンが掲げられ、その中核機能として「Default Actor Isolation」が導入されました。
参考資料
この記事はWWDC 2025の以下のセッションを参考にしています。
Approachable Concurrencyとは?
これは、開発者がデータ競合のリスクを最小限に抑えつつ、必要な時にだけ段階的に並行処理を導入できるようにするための、Swiftの設計思想や機能群全体を指す言葉です。
このアプローチは、以下の3つのフェーズを想定しています。
シンプルなシングルスレッドのコードを書く: 並行処理について明示的に指定しない限り、全ての処理がメインスレッドで動作するコードになります。
データ競合のない非同期コードを書く: UIをブロックしてアプリが固まるなど問題があれば、async/awaitなどを使い、安全に非同期処理を導入します。
並列処理でパフォーマンスを向上させる: アプリのパフォーマンスをさらに高める必要が出てきたら、TaskGroupやasync letなどを使い、複数の処理を並列で実行します。
並行性を段階的に導入することで、すべての開発者が最初から複雑な並行処理について深く理解する必要がないようにしています。
Default Actor Isolationとは?
これは「Approachable Concurrency」を実現するための新機能で、Xcode 26から作成する新規プロジェクトではデフォルトで有効になります。
概要: この設定が有効な場合、コードの大部分がデフォルトでメインアクタ
@MainActor
上で実行されるように隔離されます。これにより、UIの更新などメインスレッドで行うべき処理が、意図せずバックグラウンドスレッドからアクセスされてクラッシュする、といった典型的なデータ競合を防ぎます。既存プロジェクトでの設定: 既存のプロジェクトでは、Xcodeのビルド設定から Swift Compiler - Language にある
Default Actor Isolation
の項目をMainActor
に変更することで、この機能を有効にできます。オプトアウト(分離の方法): もちろん、重い処理をバックグラウンドで実行したいケースはあります。その場合は、関数や型に対して
nonisolated
キーワードや、Swift 6.2で導入された@concurrent
属性を明示的に指定することで、メインアクタから処理を切り離し、バックグラウンドで実行させることができます。
Swift 6.2での主な変更点
Default Actor Isolationをサポートするために、async関数の振る舞いがより直感的になるよう、いくつかの重要な変更が加えられました。
nonisolated async関数の振る舞いの変更
Swift 6.1まで:
nonisolated
な非同期関数は、呼び出し元のアクタに関わらず、常にバックグラウンドのスレッドプールで実行されていました。Swift 6.2から: デフォルトで、呼び出し元の実行コンテキスト(アクター)を継承するようになります。つまり、
@MainActor
から呼び出せば、そのnonisolated async
関数も@MainActor
上で実行されます。これにより、意図しないスレッドの切り替えが減り、コードの振る舞いが予測しやすくなります。
新しい属性 @concurrent
の導入
「nonisolated
だけど、この処理は意図的にバックグラウンドで実行したい」という場合は、新しく導入された @concurrent
属性を関数に付与します。
これにより、Swift 6.1までの「常にバックグラウンドで実行する」という振る舞いを明示的に選択できます。
既存プロジェクトのSwift 6移行
Swift 5で開発中のプロジェクトをSwift 6に移行する場合、Swift 6.2をターゲットにすることで移行が簡単になる可能性があります。
移行プロジェクトの場合、 Approachable Concurrency = No
、 Default Actor Isolation = nonisolated
が選択されています。
これを、 Approachable Concurrency = Yes
、 Default Actor Isolation = MainActor
に変更することで、新規プロジェクトと同様に段階的に並行処理を導入できるようになります。
既存の考え方は、並行処理を基本としつつメインアクターへの隔離や、データ競合を避けるための制約や属性を付与することによって Strict Concurrency Checking に適合させるアプローチでした。
新しい考え方では、メインアクターでのシングルスレッド処理を基本としながら、必要な箇所にのみ段階的に並行処理を導入するアプローチに変わります。Approachable Concurrencyを採用することで、既存のコードの多くをそのまま活用しながら、段階的に並行処理を導入し、安全にパフォーマンスを向上させることができる可能性があります。
まとめ
Swift 6.2のDefault Actor IsolationとApproachable Concurrencyは、並行処理をより安全で、学習しやすくするための変更です。デフォルトでメインスレッドに処理を限定することで開発者をデータ競合から守りつつ、@concurrent
のような新しい制御方法を提供することで、必要な箇所では意図的にパフォーマンスを最適化する手段を提供しています。
弊社で開発している「トモニテ」アプリは現在Swift 5で実装されており、できるだけ早くSwift 6に移行したいと考えています。しかし、Strict Concurrency Checking への対応が課題になっています。
そこで、Swift 6.2をターゲットとし、Approachable Concurrencyのアプローチを採用することで、従来よりも少ない変更量で安全に Strict Concurrency Checking に対応できる可能性があると考えています。今後、この手法を用いた移行の検証を行う予定です。