扩展协议与通用associatedtype
问题描述:
比方说,我们有一个协议定义为:扩展协议与通用associatedtype
protocol PAT {
associatedtype Element
}
,我也有一个枚举(典型的结果)定义为:
enum Result<Value> {
case success(Value)
case error(Error)
}
现在我想添加当Element
是Result<Value>
但是编译器不能确定Value
,因此触发编译错误,指示“引用通用需要参数”,对PAT
的扩展。
这里的代码扩展:
extension Pat where Element == Result {
}
答
的解决方案是创建associatedType另一个协议包中的结果吧。
protocol Resultable {
associatedType ValueType
var isSuccess: Bool { get }
var value: ValueType? { get }
}
,使结果推广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
。这是我的代码首先不能工作的原因。
好问题。我认为可以做'元素==结果'或其他东西,但我不确定是否可以为任何Result类型执行此操作,同时保留Value的通用属性。一种选择是使Result符合其他协议,然后你可以说'Where Element:OtherProto'。 –
jtbandes
@jtbandes Yep'结果'有效,但符合另一个协议也不起作用。我的意思是它在某些情况下有效,但如果你的方法或变量想要使用'Value',它就不会。它是:“价值只能用作具体或通用参数” –
farzadshbfn
你想在扩展中做什么? – jtbandes