如何访问一个被Actor隔离的属性

23

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

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

errors

Swift编译错误:

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

仅在actor内部才能引用actor-isolated属性'max'

那么如何访问actor-isolated属性呢?

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

Xcode 版本 13.0 beta (13A5154h) Swift 版本 5.5


尝试使用 async { print(await logger.max) }。"Actor-isolated property 'max' can only be referenced from inside the actor" 这条信息似乎并不是很有帮助... - Sweeper
@Sweeper 谢谢,但仍然失败async { ^~~~~ - Denis Kreshikhin
我认为异步对于任务已经被弃用了。 - aheze
1个回答

22

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

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

这只是告诉我'async(priority:operation:)'已被弃用:\async`已被`Task.init`替换,并将很快被删除。` - Ky -
6
请看更新后的答案。在最新的 Swift 5.5 beta 中,创建异步任务的方式已从 async 改为 Task,正如你所收到的错误信息所显示的那样。也许对答案进行编辑会比给出负评更有帮助 :) - Bradley Mackey
2
除非您需要在当前上下文中获得结果,否则此方法无效... - user187676
1
@Era 你是指在同步上下文中吗?如果是的话,那么是的,你需要确保你的“上下文”也是异步的,或者使用回调或类似的方式返回结果。例如,阻塞同步并等待结果将违反异步运行时模型。 - Bradley Mackey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接