2017-02-02 8 views
0

ジェネリック(ジェネリックプロトコル)で迅速に型の競合を解決できませんでした。私は、演算子関数内でクラス関数を呼び出そうとしているときにこのエラーが発生し続ける。タイプ変換は、汎用プロトコルと迅速に競合しますか?

Cannot convert value of type 'Chain<Initial, E.Initial, E>'to expected argument of type 'Chain<Initial, E.Initial, E>' 

以下は、演算子関数の署名と本体です。このエラーは、クラス関数に 'c'を指定する型の問題として宣言されています。

public func +<Initial, E : Bindable>(c: Chain<Initial, E.Initial, E>, e: E) -> Chain<Initial, E.Result, E> { 
return Chain.append(chain: c, element: e) 
} 

Chainクラスのappend関数の関数シグネチャ(演算子関数シグネチャと同じ)は次のとおりです。

static func append<Initial, E : Bindable>(chain : Chain<Initial, E.Initial, E>, element: E) -> Chain<Initial, E.Result, E> 

そして、Bindableプロトコルは次のように宣言されています。

public protocol Bindable { 
    associatedtype Initial 
    associatedtype Result 
} 

タイプは同じです。演算子は静的クラス関数の単なる構文上の砂糖です。私は不適切なジェネリックプロトコルを使用していますか?これは型システムのバグですか?クラスコードをオペレータコードにコピーする必要があるのはどこですか?

答えて

0

私自身の質問:クラス関数呼び出しの型シグネチャ、Chain.append(chain:c、element:e)を提供するだけで済みました。

これは、メソッド呼び出しにコンテキストを提供することで問題を解決しました。それが戻ってくるはずのタイプは分からなかった。

関連する問題