我需要在我创建的任务中使用我自己的自定义错误枚举:
enum MyError: Error {
case someError
}
var myTask: Task<MyModel, MyError> = Task { () throws -> MyModel in
// in case of an error:
// throw .someError
// ... perform some work
return MyModel()
}
但是我在任务初始化器开始时得到了以下错误:Referencing initializer 'init(priority:operation:)' on 'Task' requires the types 'MyError' and 'Error' be equivalent
.
如何限制Task
只抛出我自定义错误类型MyError
的错误?
省略不必要的类型声明:
var myTask = Task { () throws -> MyModel in
// in case of an error:
throw MyError.someError
// ... perform some work
return MyModel()
}
编译器隐式地(正确地)将myTask
类型化为Task<MyModel, Error>
。编译器并不关心你抛出的是MyError,因为那是Error的一种形式。
好吧,我现在明白了,问题仅仅是你问错了问题。您想知道为什么不能将此任务声明为Task<MyModel,MyError>
。
原因在于这个初始化式的声明方式:
extension Task where Failure == Error {
public init(priority: TaskPriority? = nil, operation: @escaping @Sendable () async throws -> Success)
}
你看到了吗?此初始化项仅适用于where Failure == Error
。那是==
,不是:
。使用此初始化式并不要求Failure类型为和Error,只要求为Error。