WWDC21推出了Swift 5.5,其中包括async/await。在探索Swift中的结构化并发和认识Swift中的async/await WWDC21会话之后,我正在尝试使用async let函数。
这是我的Playground代码:
func doIt() async -> String {
let t = TimeInterval.random(in: 0.25 ... 2.0)
Thread.sleep(forTimeInterval: t)
return String("\(Double.random(in: 0...1000))")
}
async {
async let a = doIt()
async let b = doIt()
async let c = doIt()
async let d = doIt()
let results = await [a, b, c, d]
for result in results {
print(" \(result)")
}
}
然而,对于每一个 "async let" 行,我都会收到这个错误:
error: AsyncLetSwift55WWDC21.playground:12:15: error: expression is 'async' but is not marked with 'await'
async let a = doIt()
^
await
在Exploring structured currency视频中,大约在8:10处有这个例子:
编辑:这似乎是一个Playground特有的问题。根据Apple Developer Forums上相同问题的建议,在macOS命令行项目中运行相同的代码(好的,我在异步块后添加了sleep(10)
到源文件末尾,以便应用程序在异步调用完成之前不会终止)不会出错并且产生正确的输出。
这是一个bug,还是我没有理解什么?
Task.sleep
目前只适用于非常小的值。不确定出了什么问题。 - mattwithCheckedContinuation
作为解决方法,在其中您可以调用DispatchQueue.main.asyncAfter
。 - user1046037