3

我试图检查演员的行为。这是 Swift5.5 提供的新特性。

我用官方文档swift.org中的示例代码创建了一个游乐场:

    import Foundation
    
    actor TemperatureLogger {
        let label: String
        var measurements: [Int]
        private(set) var max: Int

        init(label: String, measurement: Int) {
            self.label = label
            self.measurements = [measurement]
            self.max = measurement
        }
    }

    let logger = TemperatureLogger(label: "Outdoors", measurement: 25)
    print(await logger.max)
    // Prints "25"

但是我的编译器在这个例子中失败了:

错误

Swift 编译器错误:

'await' 在不支持并发的函数中

Actor 隔离属性 'max' 只能从 Actor 内部引用

那么如何访问参与者隔离的属性呢?

也许这是编译器或示例代码中的错误?

Xcode 版本 13.0 测试版 (13A5154h) Swift 版本 5.5

4

1 回答 1

4

将访问放在一个Task块中。async(这曾经在早期的 Swift 5.5 beta中被调用)。Actor 隔离属性通过“协作线程池”同步并强制执行独占访问,并且可以挂起,因此需要异步运行。

也不要在 Swift Playground 中尝试这个,在撰写本文时它们似乎不支持actors (beta 1)。

let logger = TemperatureLogger(label: "Outdoors", measurement: 25)
Task {
    print(await logger.max)
    // Prints "25"
}
于 2021-06-18T09:00:51.493 回答