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

protocol PAT {
    associatedtype Element
}

我还有一个枚举(典型结果)定义为:
enum Result<Value> {
    case success(Value)
    case error(Error)
}

现在我想在PATElement但编译器无法确定Result<Value>时向Value添加一个扩展名,因此会触发一个编译错误,指示“引用泛型需要参数”。
这是分机代码:
extension Pat where Element == Result {
}

最佳答案

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

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。这就是我的代码一开始不起作用的原因。

10-05 18:13