2016-12-19 11 views
3

汎用パラメータをとる関数を変数に代入しようとしています。変数に汎用パラメータを持つ関数を代入する

私はクラス「ラウドスピーカー」を持っています。 saySomething関数は、パラメータとして、プロトコルSpeakProtocolに準拠した任意のオブジェクトを取るためのものです:

class Loudspeaker { 
    func saySomething<T:SpeakProtocol> (speaker:T) { 
     print("\(speaker.thinkOfSomethingToSay())") 
    } 
} 

protocol SpeakProtocol { 
    func thinkOfSomethingToSay() -> String 
} 

ThingSayerクラスがSpeakProtocolを実装しています

class ThingSayer:SpeakProtocol { 
    func thinkOfSomethingToSay() -> String { 
     return "Hello" 
    } 
} 

私はスピーカークラスの新しいメンバーを作成します。

var aLoudspeaker:Loudspeaker 

そして、その関数の結果ではなくsaySomething関数を変数に代入したいと考えています:

var speakFunction = aLoudspeaker.saySomething 
私はその後、ThingSayerを作成し、そのspeakFunctionに渡すことで、他の場所でこの関数を呼び出します。

var aSpeaker:Thingsayer 
speakFunction(speaker:thingSayer) 

問題は、この行を次のとおりです。私にエラーを与える

var speakFunction = aLoudspeaker.saySomething 

: "汎用パラメータ 'T'を推論できませんでした。"

これで私はかなり長い間壁に頭を打ちました。私がやろうとしていることをする方法はありますか?

これは明らかに実例ですが、問題の要点は、ジェネリックパラメータを取る関数があり、その関数を変数に代入してコード内のどこかで呼び出すことです。どんな助けでも大歓迎です。

+1

[[変数に汎用関数を割り当てることはできますか]](http://stackoverflow.com/questions/40694060/is-it-possible-to-assign-a-generic-function-to -a-variable) – dfri

+0

はい、これは同じ問題のようです。 – Mike

答えて

1
var speakFuction: (speaker: ThingSayer) -> Void = aLoudspeaker.saySomething 

コンパイラを助けるために変数を宣言するときは、関数の型を明示する必要があります。

+0

これはうまくいくようですが、後で別のタイプのスピーカー(SpeakProtocolにも準拠しています)でこの機能を呼び出したいのですが?このようなことは可能ですか?これが、私が最初にジェネリックパラメータを使用しようとしていた理由です。しかし、もし私が1つのクラスに閉じ込められていれば、この場合ジェネリックスの使用に大きな価値はないようです。 – Mike

+0

次に、 'saySomething'を' func saySomething(speaker:SpeakProtocol) 'と定義してみませんか? (汎用品なし) – tomahh

+0

このようにパラメータタイプとしてプロトコルを設定できますか? – Mike

関連する問題