Swift `await`在赋值运算符之前或之后,有区别吗?

nle07wnf  于 2023-04-28  发布在  Swift
关注(0)|答案(1)|浏览(136)

await放在赋值行的开头或=运算符之后有什么区别?
例如,此代码使用这两个选项都能正确编译。

@MainActor class AppleList: ObservableObject {
    @Published var apples: [Apple]
    private let fetcher = AppleFetcher()
    init(apples: [Apple]) {
        self.apples = apples
    }
    func load() async {
        // BOTH OF THESE LINES BUILD, BUT WHAT IS THE DIFFERENCE?
        apples = await fetcher.fetch()
        await apples = fetcher.fetch()
    }
}

我只在Meet async/await in Swift视频中看到将await放在=运算符之后的示例。
我不确定这是否相关,但我也注意到大多数示例都分配给本地符号而不是属性。
AppleFetcher的代码(如果需要)。

private actor AppleFetcher {
    func fetch() async -> [Apple] {
        // Fake a network call.
        try? await Task.sleep(until: .now + .seconds(6), clock: .continuous)
        return [
            Apple(name: "honeycrisp", seeds: 47),
            Apple(name: "golden", seeds: 56),
        ]
    }
}

我从Explore structured concurrency in Swift中找到了这个Assert,但它并没有真正解释得足够详细,让我完全理解。
在let的右侧写上“try await”,因为在那里会观察到错误或暂停。
如果在我的例子中没有区别,在什么情况下(如果有的话)会有区别?

nx7onnlm

nx7onnlm1#

在功能上它们是相同的。这是两个版本的集合。地址在不同的构建之间会发生变化(就像在任何两个构建之间一样),但是代码是相同的。下面,我将在两个格式副本的断点之间切换(这样更容易看出它们的不同之处):

话虽如此,第一种方法apples = await fetcher.fetch()是公认的约定,正如vadian所指出的,这是Swift编程语言中明确建议的:并发。

相关问题