在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
的具体需求是什么?
谢谢!
1条答案
按热度按时间6ie5vjzr1#
如果一个类型符合
Error
,则它满足: Error
约束。例如,以下类型:然而,
MyError
不满足== Error
约束,因为唯一满足这个约束的类型是Error
本身。毕竟,它说“等于”Error
:)您可以将相同的逻辑应用于
Sendable
。采用throwing闭包的
Task.init
和Task.detached
版本,以及链接代码中的relayResult
,都需要== Error
,因为它们都从throwing闭包创建任务。你不知道一个抛出闭包会抛出什么类型的
Error
。你最多知道它抛出Error
。因此,这些方法只能创建一个失败类型正好是Error
的任务。它们不能创建一个失败类型是MyError
的任务。因为抛出闭包可以抛出
AnotherError
。但是,假设“抛出其他类型的错误”的问题被神奇地处理了,当你调用这些方法时,
== Error
也可以作为编译器推断Failure
类型的一种简单方法,你不需要像我上面所做的那样,明确地写任务可以抛出的错误类型。我想不出什么时候你会使用 exactly
Sendable
作为Success
类型,这似乎不是很有用。Sendable
没有任何语法要求,因此在功能上与使用Void
完全相同(又名()
,也符合Sendable
)作为Success
类型,以表示“此任务刚刚“完成”并且没有结果”。如果我选择,我肯定会选择Void
而不是Sendable
来表达这个想法。