Avatar
そうすると、 @escaping クロージャの actor context 引き継ぎとは、何(誰)の context を引き継ぐのでしょうか?
上記の場合はMainActor(呼び出し側)のcontext を引き継いでいるので問題ない(domainをescapeしていない)のではないでしょうか?
Therefore, such a closure will be actor-isolated if it is formed within an actor-isolated context.
ただし、途中でdetachedが入るとそこでcontextの引き継ぎが途切れてMainActor上ではなくなるかなあと。 func runEscaping(_ operation: @escaping () -> Void) { Task.detached { operation() } } うろ覚えなんですが、Concurrencyの機能が使われていない場合、Sendableを削除してませんでしたっけ?なのでMainActorの方のcountはエラーにならない? // Strip off Sendable and (possibly) the global actor. https://github.com/apple/swift/blob/5c05da0a1d8dad5bd945918ce9e24603091b88c5/lib/Sema/TypeCheckConcurrency.cpp#L4546 asyncとSendableを使っている場合はConcurrencyを使っているとみなされる。 // Async and @Sendable closures use concurrency features. https://github.com/apple/swift/blob/5c05da0a1d8dad5bd945918ce9e24603091b88c5/lib/Sema/TypeCheckConcurrency.cpp#L4001 actorの内部にある場合もConcurrencyを使っているとみなされる。 // If we're in an actor, we're using concurrency features. https://github.com/apple/swift/blob/5c05da0a1d8dad5bd945918ce9e24603091b88c5/lib/Sema/TypeCheckConcurrency.cpp#L4027 @Sendable付けると@MainActor Barの方もエラーになるんですよねえ func runEscaping(_ operation: @Sendable @escaping () -> Void) { operation() }
(edited)