Swift 5.5 async let - error: expression is 'async' but is not marked with 'await'
Swift 5.5 async let - error: expression is 'async' but is not marked with 'await'
WWDC21 引入了 Swift 5.5,以及 async/await。在 Explore structured concurrency in Swift and Meet async/await in Swift WWDC21 会议之后,我正在尝试使用 async let 函数。
这是我的游乐场代码:
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
Paul Hudson 的博客展示了这个例子:
Exploring structured currency 视频在 8:10 处有这个例子:
编辑:这似乎是一个 Playground-specific 问题。根据 Apple Developer Forums 中同一问题的建议,运行 相同的代码( 好吧,我确实在异步块之后将 sleep(10)
添加到源文件的末尾macOS,因此应用程序不会在异步调用完成之前终止),因为 macOS command-line 项目没有错误并产生正确的输出。
这是一个错误,还是我不明白什么?
我的建议是:不要在操场上尝试这个。游乐场还没有为这些东西准备好。您的代码在真实项目中编译和运行良好。这是一个例子:
class ViewController: UIViewController {
func doIt() async -> String {
let t = TimeInterval.random(in: 0.25 ... 2.0)
Thread.sleep(forTimeInterval: t)
return String("\(Double.random(in: 0...1000))")
}
func test() {
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)")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
test()
}
}
构建为 macOS 命令行项目(Xcode:文件 -> 新建 -> 项目,然后 select 来自 macOS 选项卡的“命令行工具”),代码完美运行。 (这是 Apple Developer Forums 中回复的建议。)
我在末尾添加了一个 sleep(10)
,这样命令行工具就不会在异步调用完成之前退出:
import Foundation
print("Hello, world!")
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)")
}
}
sleep(10)
这会产生预期的控制台输出类型(注意:每个 运行 的实际值都会不同)*:
Hello, World!
415.407747869283
574.28639828183
689.4706625185836
385.56539085197113
Program ended with exit code: 0
它作为 macOS 命令行项目运行良好,但是当我将它创建为 iOS 项目时,
那些代码:
async let a = doIt()
async let b = doIt()
async let c = doIt()
async let d = doIt()
请勿并行运行。
WWDC21 引入了 Swift 5.5,以及 async/await。在 Explore structured concurrency in Swift and Meet async/await in Swift WWDC21 会议之后,我正在尝试使用 async let 函数。
这是我的游乐场代码:
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
Paul Hudson 的博客展示了这个例子:
Exploring structured currency 视频在 8:10 处有这个例子:
编辑:这似乎是一个 Playground-specific 问题。根据 Apple Developer Forums 中同一问题的建议,运行 相同的代码( 好吧,我确实在异步块之后将 sleep(10)
添加到源文件的末尾macOS,因此应用程序不会在异步调用完成之前终止),因为 macOS command-line 项目没有错误并产生正确的输出。
这是一个错误,还是我不明白什么?
我的建议是:不要在操场上尝试这个。游乐场还没有为这些东西准备好。您的代码在真实项目中编译和运行良好。这是一个例子:
class ViewController: UIViewController {
func doIt() async -> String {
let t = TimeInterval.random(in: 0.25 ... 2.0)
Thread.sleep(forTimeInterval: t)
return String("\(Double.random(in: 0...1000))")
}
func test() {
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)")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
test()
}
}
构建为 macOS 命令行项目(Xcode:文件 -> 新建 -> 项目,然后 select 来自 macOS 选项卡的“命令行工具”),代码完美运行。 (这是 Apple Developer Forums 中回复的建议。)
我在末尾添加了一个 sleep(10)
,这样命令行工具就不会在异步调用完成之前退出:
import Foundation
print("Hello, world!")
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)")
}
}
sleep(10)
这会产生预期的控制台输出类型(注意:每个 运行 的实际值都会不同)*:
Hello, World!
415.407747869283
574.28639828183
689.4706625185836
385.56539085197113
Program ended with exit code: 0
它作为 macOS 命令行项目运行良好,但是当我将它创建为 iOS 项目时,
那些代码:
async let a = doIt()
async let b = doIt()
async let c = doIt()
async let d = doIt()
请勿并行运行。