4

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

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

4

1 回答 1

7

省略不必要的类型声明:

var myTask = Task { () throws -> MyModel in
    // in case of an error:
    throw MyError.someError
    // ... perform some work
    return MyModel()
}

编译器隐式(并且正确地)类型myTaskTask<MyModel, Error>. 编译器不在乎你抛出的是 MyError,因为那是 Error 的一种形式。


好的,我现在看到问题仅仅是你问错了问题。您想知道为什么不能将此 Task 声明为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。

于 2021-08-17T13:36:09.563 回答