Swift 6:在 @Sendable 闭包中捕获不可发送类型的“self”

问题描述 投票:0回答:1

背景

考虑这个简单的示例,其中我们有一个 Actor 和一个包含对该 Actor 的引用的类:

actor MyActor
{
    func doWork() -> Int {
        return 42
    }
}



class MyClass
{
    let worker: MyActor = MyActor()
    
    func swift6IsJustGreat()
    {
        Task {
            let number: Int = await worker.doWork()   // ERROR: Capture of 'self' with non-sendable type 'MyClass' in a `@Sendable` closure
            print(number)
        }
    }
}

问题

Xcode 16 Beta 1 在使用 Swift 6 语言模式时,在我们尝试使用 actor 的行上显示此错误:

Capture of 'self' with non-sendable type 'MyClass' in a `@Sendable` closure

我理解这个错误。

worker
MyClass
的属性,任务闭包正在捕获
MyClass
的实例,而不是
Sendable
。知道了。但是……除非它是全局的,否则我到底如何在并发中使用anything

如果我的 actor 是非 Sendable 类上的 iVar,我如何才能调用 actor 上的任何内容?

swift concurrency actor swift-concurrency swift6
1个回答
0
投票

我不知道这是否是正确的解决方案,但是将

MyClass
分配给特定的演员消除了错误:

@MainActor
class MyClass
{ 
   ... 
}

鉴于错误消息,这不是一个直观的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.