2017-05-06 81 views
1

比方说,我们有一个协议定义为:扩展协议与通用associatedtype

protocol PAT { 
    associatedtype Element 
} 

,我也有一个枚举(典型的结果)定义为:

enum Result<Value> { 
    case success(Value) 
    case error(Error) 
} 

现在我想添加当ElementResult<Value>但是编译器不能确定Value,因此触发编译错误,指示“引用通用需要参数”,对PAT的扩展。

这里的代码扩展:

extension Pat where Element == Result { 
} 
+0

好问题。我认为可以做'元素==结果'或其他东西,但我不确定是否可以为任何Result类型执行此操作,同时保留Value的通用属性。一种选择是使Result符合其他协议,然后你可以说'Where Element:OtherProto'。 – jtbandes

+0

@jtbandes Yep'结果'有效,但符合另一个协议也不起作用。我的意思是它在某些情况下有效,但如果你的方法或变量想要使用'Value',它就不会。它是:“价值只能用作具体或通用参数” – farzadshbfn

+0

你想在扩展中做什么? – jtbandes

回答

2

的解决方案是创建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: ResultableElement == Resultable。这是我的代码首先不能工作的原因。