为什么改变演员的nonSendable属性是合法的?
以下代码在 Swift 5.5(测试版)中是合法的:
class Dog {
var name = "rover"
var friend : Dog? = nil
}
actor MyActor {
let dog = Dog()
}
func test() async {
let act = MyActor()
act.dog.name = "fido"
act.dog.friend = Dog()
act.dog.friend?.name = "fido"
}
为什么这是合法的?dog 属性是共享状态,不是吗?我们不是有同时在不同线程上访问演员的狗的危险吗?这不是演员应该保护我们的吗?
奇怪的是,如果演员的dog属性是用var而不是声明的let,我们将不得不await在访问期间说出来。为什么会有所不同?Dog 是一个引用类型;它就地可变,并且无论是否用let或声明,它都以完全相同的方式可变var。