假设我们有一个协议定义为:
protocol PAT {
associatedtype Element
}
我还有一个枚举(典型结果)定义为:
enum Result<Value> {
case success(Value)
case error(Error)
}
现在我想在
PAT
是Element
但编译器无法确定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
。这就是我的代码一开始不起作用的原因。