如何访问与参与者隔离的属性

Den*_*hin 24 swift swift5 xcode13 swift-concurrency

我试图检查演员的行为。这是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"

Run Code Online (Sandbox Code Playgroud)

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

错误

斯威夫特编译器错误:

不支持并发的函数中的“await”

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

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

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

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

Bra*_*key 23

将访问权限放在一个Task块中。Actor 隔离属性通过“协作线程池”同步和强制执行独占访问,并且可以挂起,因此需要异步运行。

let logger = TemperatureLogger(label: "Outdoors", measurement: 25)
Task {
    print(await logger.max)
    // Prints "25"
}
Run Code Online (Sandbox Code Playgroud)

  • @KyLeggiero 查看更新的答案。在最新的 Swift 5.5 beta 中,异步任务的创建已从“async”更改为“Task”,正如您收到的错误消息清楚地显示的那样。也许对答案的编辑会比否决更有帮助:) (6认同)
  • 除非您需要当前上下文中的结果,否则这不起作用...... (3认同)