2017-05-06 144 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。這是我的代碼首先不能工作的原因。