使用通用关联类型扩展协议

Extend a protocol with generic associatedtype

假设我们有一个协议定义为:

protocol PAT {
    associatedtype Element
}

我还有一个枚举(典型结果)定义为:

enum Result<Value> {
    case success(Value)
    case error(Error)
}

现在我想在 ElementResult<Value> 时向 PAT 添加扩展名,但编译器无法确定 Value 因此会触发编译错误,指示 "reference to generic requires argument".

这是扩展代码:

extension Pat where Element == Result {
}

解决方案是创建另一个带有 associatedType 的协议来将 Result 包装在其中。

protocol Resultable {
    associatedType ValueType
    var isSuccess: Bool { get }
    var value: ValueType? { get }
}

并使 Result 扩展为 Resultable:

extension Result: Resultable {
    typealias ValueType = Value
    var isSuccess: Bool { ... }
    var value: ValueType? { ... }
}

并使用 Resultable 扩展 PAT:

extension PAT where Element: Resultable {
    // in here you have access to Resultable.ValueType
}

备注

确保写 Element: Resultable 而不是 Element == Resultable。这就是我的代码最初无法正常工作的原因。