【iOS】Swift6対応方法!Strict Concurrency Checking(厳密な並行性チェック)
この記事からわかること
- Swift6の対応方法
- Strict Concurrency Checking(厳密な並行性チェック)
- 有効にするには?
- 警告やエラーの解消方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:16.0
- iOS:18.0
- Swift:6
- macOS:Sonoma 14.6.1
公式リファレンス:Swift 6へのアプリの移行 - WWDC24 - ビデオ
Swift6からコンパイル時に検出できるように
公式リファレンス:Swift 6 アプリで厳密な並行性を採用する
Xcode16からSwift6モードのコンパイラが搭載されるようになりSwift6では厳密に並行性をチェックされるようになります。このチェックにより、「特定の再現手順の確立が容易でない場合もあるためデバッグが困難であったデータ競合の可能性」をコンパイル時に検出することが可能になりました。
Xcode16ではデフォルトではSwift6モードは有効になっていません。そのためXcodeをアップデート後に既存プロジェクトを開いても、新規プロジェクトを立ち上げても今までと変わらずSwift5モードで実行されます。
Swift6モードでのコンパイルエラーをチェックする
いきなりSwift6モードを有効にしてしまうとエラーが発生しビルドが通らなくなってしまうのでまずはコンパイルエラーになる箇所をチェックして、都度コードベースでの修正対応を行ってから有効にする流れをとります。
チェックするには「Build Settings」>「Swift Compiler - Upcoming Features」>「Strict Concurrency Checking(厳密な並行性チェック)」がMinimal
、Targeted
、Complete
の3つから選択できるようになっているのでTargeted
またはComplete
に指定します。
公式リファレンス:Setting name: SWIFT_STRICT_CONCURRENCY
Minimal:デフォルト設定。Swift Concurrencyを利用している箇所かつ明示的にSendableを定義している箇所でのみチェック
Targeted:Swift Concurrencyを利用している箇所でのみチェック
Complete:Swift Concurrencyを利用していない箇所も含めてプロジェクト全体でチェック
これでビルドを行うと例えば以下のような警告が表示されるようになります。
Stored property 'プロパティ名' of 'Sendable'-conforming class 'クラス名' has non-sendable type 'データ型'; this is an error in the Swift 6 language mode
Main actor-isolated class property 'shared' can not be referenced from a nonisolated context; this is an error in the Swift 6 language mode
Swift6モードを有効にする
実際にSwift6モードに変更するには「Build Settings」>「Swift Compiler - Language」>「Swift Language Version」をSwift6
に設定するだけです。
Swift6
に設定するとStrict Concurrency Checking
はComplete
に設定され、警告ではなくコンパイルエラーに変わりビルドができなくなります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。