假设我们将协议定义为:
protocol PAT {
associatedtype Element
}
我还有一个enum(典型结果)定义为:
enum Result<Value> {
case success(Value)
case error(Error)
}
现在我想在PAT
为Element
时向Result<Value>
添加扩展名,但编译器无法确定Value
因此会触发编译错误,指示“引用泛型需要参数”
这是扩展代码:
extension Pat where Element == Result {
}
答案 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
。这就是我的代码首先没有工作的原因。