Swift任务扩展:成功==可发送,失败==必须出错?

holgip5t  于 2023-03-28  发布在  Swift
关注(0)|答案(1)|浏览(181)

在Apple文档中看到Task定义为:

@frozen struct Task<Success, Failure> where Success : Sendable, Failure : Error

我在网上看到过一些代码,人们在Task中添加了如下约束:

extension Task where Failure == Error {}

和/或

extension Task where Success == Sendable {}

例如,代码here使用Failure == Error约束扩展了Task。鉴于Task是使用Failure: Error约束定义的,我想知道添加Failure == Error的具体需求是什么?
谢谢!

6ie5vjzr

6ie5vjzr1#

如果一个类型符合Error,则它满足: Error约束。例如,以下类型:

enum MyError: Error {
    case somethingBadHappened
}

然而,MyError不满足== Error约束,因为唯一满足这个约束的类型是Error本身。毕竟,它说“等于”Error:)
您可以将相同的逻辑应用于Sendable
采用throwing闭包的Task.initTask.detached版本,以及链接代码中的relayResult,都需要== Error,因为它们都从throwing闭包创建任务。
你不知道一个抛出闭包会抛出什么类型的Error。你最多知道它抛出Error。因此,这些方法只能创建一个失败类型正好是Error的任务。它们不能创建一个失败类型是MyError的任务。

// let's say that calling Task.init with Failure being MyError is allowed
Task<SomeSuccessType, MyError> {
    // some code that throws AnotherError
}

因为抛出闭包可以抛出AnotherError
但是,假设“抛出其他类型的错误”的问题被神奇地处理了,当你调用这些方法时,== Error也可以作为编译器推断Failure类型的一种简单方法,你不需要像我上面所做的那样,明确地写任务可以抛出的错误类型。
我想不出什么时候你会使用 exactlySendable作为Success类型,这似乎不是很有用。
Sendable没有任何语法要求,因此在功能上与使用Void完全相同(又名(),也符合Sendable)作为Success类型,以表示“此任务刚刚“完成”并且没有结果”。如果我选择,我肯定会选择Void而不是Sendable来表达这个想法。

相关问题