当函数返回成功和错误
Result
时,是否需要将该函数标记为async
并带有await
?
例如……
func asyncStoreData(_ image: UIImage, dateTaken: Date) async -> Result<String, Error> {
// Implementation of the function body...
}
不,仅仅因为一个函数返回一个
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
类型以及这是否真的合适。 (但这是一个单独的问题,超出了这里的范围。)