MyUIClass
我有一个孤立的班级@MainActor
:
@MainActor
class MyUIClass {
func show(object: Any?) {}
}
要使用该show
函数,需要在MainActor
上下文中访问它:
class Santa {
@MainActor
func present1(gift: Any?) {
MyUIClass().show(object: gift) // ✅
}
func present2(gift: Any?) {
Task { @MainActor in
MyUIClass().show(object: gift) // 💥 Task or actor isolated value cannot be sent; this is an error in the Swift 6 language mode."
}
}
}
我不明白的是,当我尝试在块gift
内使用时,我收到警告Task
present2
无法发送任务或参与者隔离值;这是 Swift 6 语言模式下的错误。
在第一个函数中present1
,参数gift: Any?
没有被隔离到MainActor
(对吗?)并且不是Sendable
,但没有错误。然而,错误只发生在第二种情况下,在Task
块内。
我知道标题有点奇怪。我理解@MainActor
函数只能在MainActor
上下文中执行,并且Task { @MainActor in }
可以在任何上下文中执行。
尽管如此,在这两种情况下(present1 / present2
),似乎在上下文MyUIClass().show(object: gift)
中执行了MainActor
,那么为什么错误行为会有差异呢?
注释
@MainActor
确实应该按位置读取——它会影响其后的内容,在第一个函数中,它是包括其参数在内的整个函数,而在第二个函数中,它只是在之间发生的{ }
事情Task
。因此,在第一个例子中,
gift
已经是MainActor
孤立的,没有什么需要跨越参与者边界。然而在第二个例子中,
gift
并不是MainActor
孤立的,而且它也不是Sendable
,所以它不能跨越边界,从而导致编译错误。为了进一步说明,这将编译得很好:
那么这样...
... 因为
String
是Sendable
。