Swift 6
データ競合を防ぐ
競合状態を防ぐのを目的とはしていない
データ競合を防ぐためにデータ隔離を行う
Isolation は Compose でもよく出てくる共通の課題
隔離ドメインを超えられる条件 Sendable
Region based isolation は別物として分けて捉えておくと良いかも
Isolation が暗黙的に宣言されるのがわかりにくい原因かも
4種類に分類できる
- cloure(nonisolated)
- typed isolated
- parameter isolated
- captured value isolated
Actor が使えない場面に対して、 Swift6 iOS18 以降で Mutex, Atomic を用意しようとしている
Swift6 ではデータ共有するようなプログラムに Actor を利用しないとそもそもビルドできない
Strict Concurrency
Objc -> Swift Optional と似ている ヌルポがなくなる
マルチスレッドのクラッシュが排除できる
forcedUnwrapped で実行時エラーが出ないならコンパイラを黙らせるような挙動も同じような感覚になるはず
全てを修正するのが理想だが、実行時に問題ないことを検査できていれば妥協は可能
スレッド起因の原因不明な BAD ACCESS, SIG ABORT は Strict Swift Concurrency で解消される可能性はある
Isolation Boundary
隔離境界を超えているかどうか
iOS アプリでは MainActor にとどまるのであまり問題ならないユースケースが多いのでは
不必要に MainActor で処理している部分はないか?
runtime で UIKit をメインスレッド以外が触っている紫の警告がコンパイル時にできるようになる
actor を採用すると Sendable の適用、 suspention point を挟むので状態がその前後で変わる可能性があって、条件判定していたら、二重チェックが必要になる
Xcode 16 では Swift 6, 5 の切り替えが可能なので猶予はある
Swift 5 Complete Strict Concurrency が対応できれば、 Swift 6 に移行できる
Migration guide
外側のモジュールから徐々に
内側の protocol 準拠が簡易に済むなら並行して進めるのもおすすめ