2017-05-06 20 views
1

のは、私たちのようにプロトコルを定義したとしましょう:今、私は追加したい汎用associatedtypeでプロトコルを拡張

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

protocol PAT { 
    associatedtype Element 
} 

と私はまた、列挙型(典型的な結果が)のように定義していますがResult<Value>であるが、コンパイラがValueを判断できない場合、コンパイルエラーが発生し、 "genericへの参照は引数を必要とする"というコンパイルエラーがトリガされるので、PATへの拡張。ここ

は拡張のためのコードです:

extension Pat where Element == Result { 
} 
+0

良い質問です。私は 'Element == Result 'などを実行することは可能だと思いますが、値の上にジェネリックなまま残っている場合は、結果タイプに対して行うことはできません。一つの選択肢は、Resultを他のプロトコルに準拠させることです。次に、 'Element:OtherProto'と言うことができます。 – jtbandes

+0

@jtbandes Yep 'Result 'は動作しますが、別のプロトコルに準拠していません。私はそれがいくつかのケースで動作することを意味しますが、あなたがメソッドや変数が 'Value'で動作したいのではないでしょう。それはsaisです: "値は、具体的なまたは汎用的なパラメータとしてのみ使用することができます" – 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: ResultableないElement == Resultableを作ります。これが私のコードが最初に機能していなかった理由です。

関連する問題