Avatar
Avatar
koher
@escaping な non-@Sendable クロージャは actor context を引き継ぐという理解なんですけど、↓の foo が返すクロージャは常にメインスレッドで実行される( true が表示される)ということでしょうか? @MainActor func foo() -> () -> Void { // main actor context { // actor context を引き継ぐ print(Thread.isMainThread) } } この foo で返されたクロージャを Task.detached から呼び出すと false が表示されたんですが、これは僕の仕様理解が間違っているか、バグか、未実装か、実行方法に問題がある(何かオプションを付けないといけないなど)か、どう考えれば良いでしょうか? (edited)
non-Sendableな値(ここではクロージャ)は平行に触ることが出来ないので、Task.detachedでクロージャをコピーすることが違反だと思います。
t_naruhodo 1
3:09 AM
@swift-5.7.3 -warn-concurrency -Xfrontend -parse-as-library import Foundation @MainActor func foo() -> () -> Void { { print(Thread.isMainThread) } } @main struct Main { @MainActor static func main() async { let f = foo() let t = Task.detached { f() } _ = await t.value } } (edited)