我正在努力理解Swift中的泛型类型约束。这是我的起点:
class Promise<T> {
func resolve(_ block:@escaping (T) ->Void) {}
func fulfill(_ result:T) {}
}
Promise就是那种可以在未来得以实现的东西。当它与Swift的Result
类型一起用于从后台队列返回结果到主队列时,这非常有用:
let promise = Promise<Result<String, Error>>()
promise.fulfill(.success("Hello"))
promise.fulfill(.failure(NSError()))
现在我想为所有使用Result
的Promise实例添加扩展,以添加这些辅助方法:
extension Promise where T == Result<X, Error> {
⬆︎ Here's the problem ⚡️
func failure(_ error:Error) {
fulfill(.failure(error))
}
func success(_ result:X) {
fulfill(.success(result))
}
}
// Shorter:
let promise = Promise<Result<String, Error>>()
promise.success("Hello")
promise.failure(NSError())
唯一的问题是上面的代码无法编译,因为 X
没有定义。我想表达的是:
当泛型类型 T
是类型为 Result<X,Z>
的时候,扩展 Promise
,其中 X
可以是任何东西,Z
必须是类型为 Error
的 → Result<*, Error>
。这是否可能?