结果返回类型与异步和等待

问题描述 投票:0回答:1

当函数返回成功和错误

Result
时,是否需要将该函数标记为
async
并带有
await

例如……

func asyncStoreData(_ image: UIImage, dateTaken: Date) async -> Result<String, Error> {
    // Implementation of the function body...
}
swift async-await closures
1个回答
0
投票

不,仅仅因为一个函数返回一个

Result
,那 not 就意味着你必须用
async
来装饰该函数。仅当函数内部的代码执行
async
时,才会将函数标记为
await
。如果没有看到你的实现,就不可能说
async
装饰是否合适。

简而言之,如果这些函数有

async
功能,我们只使用
await
函数。函数的返回类型不相关。


顺便说一句,您说“当函数返回成功且错误结果的完成块时……”。这里没有完成块。不要将

Result
返回类型和“完成块”混为一谈。他们是两个不同的东西。当然,我们倾向于将
Result
类型与遗留完成处理程序代码一起使用,但反之则不然:
Result
的存在并不意味着您正在使用完成处理程序闭包。在您的示例中,没有完成闭包。


FWIW,当采用 Swift 并发时,我们不仅会废弃完成块,而且还经常停止使用

Result
返回类型。通常,它会是:

func asyncStoreData(_ image: UIImage, dateTaken: Date) async throws -> String {
    // Implementation of the function body...
}

Swift 并发的关键特性之一是我们可以消除完成块和

Result
类型的语法噪音。
Result
类型是在完成处理程序关闭当天返回成功/失败结果的一种非常方便的方法。但是,
async
-
await
通常会使旧的
Result
类型变得毫无意义。

话虽如此,我们确实在 Swift 并发中使用

Result
返回类型的边缘情况。一般来说,我们不会这样做,但在某些孤立的情况下,我们可能会这样做。因此,如果您正在检查 Swift 并发代码库,其中有一个返回
Result
类型的方法,这并不一定意味着存在错误,但您必须检查代码并问自己为什么调用此方法可能需要
Result
类型以及这是否真的合适。 (但这是一个单独的问题,超出了这里的范围。)

© www.soinside.com 2019 - 2024. All rights reserved.