以下代码在 Swift 5.5 (beta) 中是合法的:
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
属性是用var
而不是声明的let
,我们将不得不await
在访问期间说。为什么会有所不同?Dog 是一个引用类型;它在适当的位置是可变的,并且无论是否用let
or声明它都以完全相同的方式可变var
。