考虑以下(愚蠢的)示例:

func u () async -> UInt32 {
    let r =  UInt32(Int.random(in: 1...10))
    sleep(r)
    return r
}

func v(_ x: UInt32) -> UInt32 {
    x
}

Task.init{
    print(v(await u()))
    print(await v(u()))
    await print(v(u()))
}

任务中的所有三行似乎都有效.它们是等价的吗?或者我应该注意哪些trap ?谢谢

推荐答案

try类似,Swift允许您在包含async方法的表达式的任何部分放置await关键字:

func ƒ<T>(_ v: T) -> T { v }


// All equivalent:
func somethingThatThrows() throws {}
print(ƒ(try somethingThatThrows()))
print(try ƒ(somethingThatThrows()))
try print(ƒ(somethingThatThrows()))


// All equivalent:
func someAsyncFunc() async {}
Task {
    print(ƒ(await someAsyncFunc()))
    print(await ƒ(someAsyncFunc()))
    await print(ƒ(someAsyncFunc()))
}

Swift grammar reference for the await keyword确实有一个例子,说明await的位置很重要(await只对需要awaited的整个表达式的子表达式进行awaiting),但在这里并不太相关:

// await applies to both function calls
sum = await someAsyncFunction() + anotherAsyncFunction()

// await applies to both function calls
sum = await (someAsyncFunction() + anotherAsyncFunction())

// Error: await applies only to the first function call
sum = (await someAsyncFunction()) + anotherAsyncFunction()

Swift相关问答推荐

为什么我的引用类型对象在初始化后有3个强引用?

SwiftUI—如何识别单词并获取视觉中的位置

在解码字符串时需要帮助.

减go 用SWIFT struct 填充的NSCountedSet

Variadic泛型与Swift中的值和类型参数包

按变换zoom 在UIView中不起作用

如何让ScrollView缩小到合适的大小,并在没有黑客攻击的情况下占用最小空间

仅使用@MainActor注释类的部分时的并发问题

如何在应用程序区域永久更改 NSCursor?

为什么 Swift URL 的 init?(string: String,relativeTo: URL?) 仅添加协议?

找出touch 点的屏幕亮度

如何根据 DatePicker 中选定的日期实现 TabView 页面切换?

为什么自定义串行队列的目标是全局队列时,Swift中不会并发执行?

仅当 boolean 为真时才实现方法(application:didReceiveRemoteNotification)

SwiftUI 从任务中安全更新状态变量

`@available` 属性在 macOS 版本上被错误地限制

我可以在 Swift 中为泛型类型 T 分配默认类型吗?

如何在 Swift 中复制字典?

是 swift 中另一个日期的同一周、月、年的日期

使用 phimagemanager 将图像保存到自定义相册?