考虑这个简单的示例,其中我们有一个 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 上的任何内容?
我不知道这是否是正确的解决方案,但是将
MyClass
分配给特定的演员消除了错误:
@MainActor
class MyClass
{
...
}
鉴于错误消息,这不是一个直观的解决方案。