8

以下代码在 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 是一个引用类型;它在适当的位置是可变的,并且无论是否用letor声明它都以完全相同的方式可变var

4

1 回答 1

6

你是对的,这样的访问是不安全的,今天的 Swift 5.5 并没有阻止这一点,除非你-warn-concurrency明确地传递标志。

请参阅Staging in Sendable 检查提案(以及讨论检查功能推出计划的论坛帖子)。

您还可以在此处的路线图更新中阅读有关从现在开始在 Swift 5.5 和 Swift 6 中的并发安全性的总体计划:Swift 5 和 6中的并发。

于 2021-08-24T11:13:39.753 回答