2016-08-13 6 views
-2

に準拠するオブジェクトのArrayがある場合は私の質問。配列の各メンバーのメソッドを呼び出す配列を繰り返し処理したい。しかし、私が呼びたいメソッドは静的でジェネリックを使用しています。私はこれを行うには、配列内の要素のクラスを取得する必要があります。あなたはどのようにそのオブジェクトのクラスを取得しますか?出来ますか?ジェネリックスを使用する関数で使用するプロトコルに準拠するクラスまたは構造体を取得します

私はSwiftに汎用関数のライブラリを書いています。

私は機能として有しているDBAbleプロトコルと呼ばれています:

static func get<T: DBable >(id:Int) -> T? 

私はDBAbleに準拠してオブジェクトの配列を持っている:

let objs:[DBAble] = [] 

私は、配列を反復処理し、呼び出したいです:

for obj in objs { 
    obj.get(id: anInt) 
} 

しかし、このメッセージが表示されます:

静的メンバは、「取得」タイプ「DBable.Protocol」

のインスタンスで使用することはできませんクラス(または構造体の型)を見つける方法はありますに準拠したオブジェクトのプロトコル?私ができることを理解しています:

if obj is User { 

} 

これは私が探している解決策ではありません。

+0

あなたの編集は、あなたのforループで呼び出されたときに 'get(_ :)'が返すと期待していることを明確にしていません。あなたは 'T == obj.dynamicType'を期待していますか? – Hamish

答えて

0

dynamicTypeは、実行時にあなたのタイプを与えるのに対し、怒鳴る方法でタイプT

static func get<T: DBable >(id:Int) -> T? 

は、コンパイル時に認識されなければならないことをアプリケーションのアプローチ、それに伴う問題。

この質問を検討している人は誰も、ランタイム時にジェネリック関数で使用するタイプを見つけることはできません。 @hamishのコメントで説明したように

"element.dynamicType is the actual type of a given element in your array. Your get(_:) method has a generic parameter T that must be known at compile time" 
関連する問題