Swift6に向けて: Strict Concurrency Checking対応
こんにちは。株式会社ココナラアプリ開発グループ、iOSチームの上沼です。
現在ココナラiOSチームでは、Swift6に移行していくために、「Strict Concurrency Checking」の対応を進めています。今回は、進め方や対応の中で得た知見について紹介します。
Strict Concurrency Checking について
Strict Concurrency Checkingを設定することで、コンパイル時にデータ競合のリスクを検知し、並行処理における安全性を担保することができるようになります。
この設定は3つのレベルがあり、段階的に移行できるよう設計されています。
- Minimal: 明示的にSendableが採用されている箇所でSendable制約を、Concurrencyが利用されている箇所で actor-isolated チェックを実行
- Targeted: Minimalに加え、暗黙的にSendableが採用されている箇所でもSendable制約チェックを実行
- Complete: モジュール全体を通してSendable制約と actor-isolated チェックを実行
XcodeのBuild Settings > Strict Concurrency Checking で設定することができます。
ココナラアプリに適用してみる
Swift Language VersionをSwift6にすると、コンパイルエラーとして扱われるため、まずはSwift5のままStrict Concurrency CheckingをCompletedに設定しました。
こうすることで、プロジェクト全体で修正する必要のある箇所がどれだけあるのかを前もって確認することができます。
ココナラアプリでは結果として、2000件以上の警告が表示されました。
どのように進めていくのか
多くの警告が表示されたため、一度に全ての箇所を修正しリリースするのは、工数やリスクの面から現実的ではないと判断し、最初はSwift6に設定せず、上記設定のまま、メンバー全員で都度修正してリリースしていく方針にしました。全ての警告が解消できたタイミングでSwift6に設定し、移行完了という流れです。
警告の解消
最初のスコープでは、すぐに対応できる箇所として、awakeFromNibメソッド内で発生している以下の警告の解消を進めています。
Main actor-isolated property xxx can not be mutated from a nonisolated context
awakeFromNib内がnon-isolatedコンテキストであるため、メインアクターのプロパティを参照できないという警告です。
こちらの警告は、awakeFromNibがメインスレッドで実行されるため、MainActor.assumeIsolated
を利用する方針で対応しました。
Webviewの警告
警告の中には一部対応必須のものがあり、それがWebviewで生じていた以下の警告です。
Instance method 'webView(_:didReceive:completionHandler:)' nearly matches optional requirement 'webView(_:didReceive:completionHandler:)' of protocol 'WKNavigationDelegate'
対応せずにWebviewを開くと該当のdelegateメソッドが呼ばれず、ココナラでは、401 Authorization Required
と表示されてしまう不具合が発生しました。
Xcode16からWKNavigationDelegateの一部メソッドのcompletionHandlerに@MainActor
や@Sendable
が追加されており、Strict Concurrency CheckingをComplete
にすることで上記事象が発生するようです。
optional func webView(
_ webView: WKWebView,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping @MainActor @Sendable (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
)
こちらはエラーとして検知されないため、動作確認や警告の検索等で検知し、修正する必要があるので、Strict Concurrency Checking対応を行う場合は事前に注意が必要です。
まとめ
今回は、Strict Concurrency Checkingの対応の進め方や対応の中で得た知見などを紹介しました。今後同様の対応をする際に参考になれば幸いです。
ココナラでは、一緒に事業のグロースを推進していただける様々な領域のエンジニアを募集しています。iOSアプリ開発だけでなく、フロントエンド領域・バックエンド領域などでも積極的にエンジニア採用を行っています。少しでも興味を持たれましたら、エンジニア採用ページをご覧ください。
Discussion