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

时间:2017-05-06 18:21:42

标签: swift generics enums swift-protocols associated-types

假设我们将协议定义为:

protocol PAT {
    associatedtype Element
}

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

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

现在我想在PATElement时向Result<Value>添加扩展名,但编译器无法确定Value因此会触发编译错误,指示“引用泛型需要参数”

这是扩展代码:

extension Pat where Element == Result {
}

1 个答案:

答案 0 :(得分:2)

解决方案是使用associatedType创建另一个协议以将Result包装在其中。

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

并使结果扩展为可结果:

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

并使用PAT扩展Resultable

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

注意

确保Element: Resultable而不是Element == Resultable。这就是我的代码首先没有工作的原因。