Avatar
Avatar
hironytic
(B) が MainActor ではないところが微妙
↑の話で考えると、 (B) は最終的な仕様上 MainActor にならないし、現状でも MainActor に守られているわけではないけど、 self.nameLabel.text = ... みたいなのが書けないと既存コードが破壊されまくるので、現状ではコンパイラが MainActor 扱いにしてコードの互換性を保っている(ただし守られてはいない)、 Swift 6 では MainActor でなくなるし await 必須になる、ということになる? そして、それと bar をすっ飛ばして Task.initfoo の context を引き継ぐ話はまた別で、 @Sendable は actor の context をぶった切る、 @Sendable でない @escaping なクロージャが何かの actor の context を持つことはないと考えると、 Task.init に渡されるクロージャは、それが宣言された場所で最も近い(内側のスコープの) actor を引き継ぐと考えれば一般化できる? という感じでしょうか。
12:59 AM
// Actor 1 a { // @escaping // どの Actor でもない Task.init { // Actor 1 await MainActor.run { // MainActor b { // @escaping // どの Actor でもない Task.init { // MainActor c { // @Sendable @escaping // どの Actor でもない Task.init { // どの Actor でもない actor2 { // Actor 2 @Sendable @escaping // Actor 2 d { // @escaping // どの Actor でもない Task.init { // Actor 2 } } } } } } } } } }
1:00 AM
↑のような感じ?