Swift 5.5 并发:创建具有自定义错误类型的任务
Swift 5.5 Concurrency: creating a task with custom error type
我需要在我创建的任务中使用我自己的自定义错误枚举:
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 类型是 an Error,它要求它是 be Error.
我需要在我创建的任务中使用我自己的自定义错误枚举:
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 类型是 an Error,它要求它是 be Error.