Swift Digest
Blog | Swift.org Blog

データ競合エラーのないパッケージエコシステムへの道筋

Plotting a Path to a Package Ecosystem without Data Race Errors

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

何が発表されたのか

Swift 6 は、Swift 6 language mode を opt in したコードに対して、コンパイル時のデータ競合安全性チェックを行います。データ競合はクラッシュ・一貫性のない挙動・性能問題の原因になるため、アプリとその依存パッケージが早期にこのチェックを有効化することが望まれます。

モジュールは依存先とは独立に段階的に Swift 6 language mode を採用できますが、データ競合安全性の効果が完全に得られるのは、すべてのモジュールが採用したときです。そこで本記事では、エコシステム全体の進捗を追跡する仕組みとして、Swift Package Index の新しい Ready for Swift 6 ページが紹介されています。

このページは、パッケージが自分の都合で Swift 6 language mode を採用しているかどうかとは別に、「もし全パッケージに対して strict concurrency チェックを有効にしたら何件が通過するか」を示します。つまり、エコシステム全体がデータ競合安全に近づいている度合いを俯瞰できる指標です。

何に使えるのか

エコシステム全体の進捗を追う

Ready for Swift 6 ページでは、データ競合エラーのないパッケージ数の推移を時系列で確認できます。記事公開時点では、Sendable 適合がより多く追加されたプラットフォーム SDK の恩恵もあり、データ競合エラーゼロのパッケージが 43% を超えていました。

今後の進捗は 2 つの方向から進むと説明されています。1 つは、より多くのパッケージがチェックを有効化し、コンパイラが指摘した潜在的なデータ競合を作者が修正していくこと。もう 1 つは、コンパイラの改良によってデータ競合チェックが洗練され、診断が整理されていくことです。

個々のパッケージのデータ競合安全性を確認する

Swift Package Index は、complete の strict concurrency チェックでエラーゼロになるパッケージに対して、「Safe from data races」ラベルを他のメタデータと並べて表示します。あるパッケージにデータ競合安全性の問題が報告されていないかを、採用前に判断する材料になります。

互換性とデータ競合安全性の違いに注意する

Swift 6 への移行期には、Swift Package Index の互換性マトリクスで Swift 6 に緑のチェックが付いていながら、同時にデータ競合安全性のエラーを抱えているパッケージを見かけることがあります。

これは矛盾ではありません。互換性チェックでは、Swift Package Index はパッケージ作者が指定した language mode を使ってビルドします。パッケージは Swift 6 language mode や strict concurrency チェックを採用する前から Swift 6 と互換であり得ます。マトリクスはあくまで「互換性」だけを示すものです。データ競合安全性に潜在的な問題があるパッケージを採用するかどうかは利用者の判断ですが、緑のチェックが付いていれば採用自体は可能です。

導入・今後の位置づけ

コンパイル時のデータ競合安全性は Swift にとって大きな前進であり、並行処理に起因するバグを丸ごと一つのクラスとして排除し、コードの安全性と保守性を高めます。各モジュールが Swift 6 language mode へ移行するたびに、エコシステム全体のデータ競合安全性への移行が一歩進みます。

利用者は、自分のパッケージを移行することで貢献でき、エコシステム全体の進捗は Swift Package Index の Ready for Swift 6 ページで追えます。

関連リンク