2016-09-09 23 views
0

私はSwiftで以下のことを達成しようとしています。タイプを汎用のget関数に渡し、そのタイプとパラメータに基づいて別のリポジトリを使用して戻しますクラス。Swiftの一般的なタイプを使用している工場

これは少し奇妙なことですが、それは私に多くの時間を節約し、後でもっと適切にリファクタリングすることができます。 ここにコードがありますが、Foo1RepositoryとFoo2Repositoryの行でエラーがコンパイルされます。「Foo1RepositoryのタイプをTに変換できません。

基本的にFoo1RepositoryもちろんのBaseEntityから継承(と同じことがfoo2はのために真である)FOO1を返す必要があります

class func Get<T: BaseEntity>(id: Int) -> T 
{ 
    if (T is Foo1) { 
     return Foo1Repository.Get(id) 
    } 
    else if (T == Foo2) { 
     return Foo2Repository.Get(id) 
    } 

    return T() 
} 

私が行うことで、この機能を呼び出すために期待していた。

let foo = FactoryClass.Get<Foo1>(1) 

私はすぐにあなたが「適切なリポジトリを呼び出すだけではなく、

let foo = Foo1Repository.Get(1) 

あなたはすべて設定されています。ここには奇妙な工場パターンは必要ありません。

私が継承したコードのリファクタリングをあまり行わずに、これを実行する必要があるとしましょう。私は後で適切なリファクタを計画することに戻るでしょう。

私は物事の組み合わせを試しましたが、それでもコンパイラエラーを乗り越えることはできません。このようなことが可能か、それとも弾丸を噛んで別のルートに進む必要がありますか?本当にありがとう!

+0

1つの質問、リポジトリパターンを実装しようとしていますか?それはそれに非常に近いからです。 –

+0

ええ、スウィフトの文脈では少し難しい/ FMDB/SQLiteを使用しているのでORMはありません – NullHypothesis

答えて

0

だから私はそれを理解した!私は他の人がこれを行う方法を見ることができるように答えを共有したいと思っていました。うまくいけば助けになると思う。

func Get<T: BaseEntity>(id: Int) -> T 
    { 
     if (T.self == Foo1.self) { 
      return Foo1Repository.Get() as! T 
     } 
     else if (T.self == Foo2.self) { 
      return Foo2Repository.Get() as! T 
     } 
     ... 

     return T() 
    } 

だから、全体として見ることができます!最後にTが鍵だった。型チェックにはisの代わりに==も使用します。

関連する問題