将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”,因为在那里会观察到错误或暂停。
如果在我的例子中没有区别,在什么情况下(如果有的话)会有区别?
1条答案
按热度按时间nx7onnlm1#
在功能上它们是相同的。这是两个版本的集合。地址在不同的构建之间会发生变化(就像在任何两个构建之间一样),但是代码是相同的。下面,我将在两个格式副本的断点之间切换(这样更容易看出它们的不同之处):
话虽如此,第一种方法
apples = await fetcher.fetch()
是公认的约定,正如vadian所指出的,这是Swift编程语言中明确建议的:并发。