Swift 5.5并发:创建一个带有自定义错误类型的任务



我需要在我创建的任务中使用我自己的自定义错误枚举:

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。

相关内容

  • 没有找到相关文章

最新更新