使用通用关联类型扩展协议
Extend a protocol with generic associatedtype
假设我们有一个协议定义为:
protocol PAT {
associatedtype Element
}
我还有一个枚举(典型结果)定义为:
enum Result<Value> {
case success(Value)
case error(Error)
}
现在我想在 Element
为 Result<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
。这就是我的代码最初无法正常工作的原因。
假设我们有一个协议定义为:
protocol PAT {
associatedtype Element
}
我还有一个枚举(典型结果)定义为:
enum Result<Value> {
case success(Value)
case error(Error)
}
现在我想在 Element
为 Result<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
。这就是我的代码最初无法正常工作的原因。