はい、ジェネリックをネストできます。あなたが持っているものに問題がこの行です:
ここ
class BaseService<T: BaseVM<BaseModel>> { ...
あなたはBaseService
は、その一般的なBaseModel
IS BaseVM
から継承する形で初期化されなければならないと述べました。あなたはBaseService
は、そのモデルBaseModel
から継承BaseVM
から継承する形を取ることができるようにしたい場合は、あなたがこのようにそれを行う必要があるだろう。ここでは
class BaseService<T: BaseModel, U: BaseVM<T>> { ...
はそれがコンパイルの上、あなたが持っているもののバージョンです。
class BaseModel {}
class BaseVM<T: BaseModel> {}
class BaseService<T: BaseModel, U: BaseVM<T>> {
//init viewmodel with generic model
}
class Human : BaseModel {
var name = ""
}
class HumanVM: BaseVM<Human> {
var name = ""
init(model : Human) {
super.init()
name = model.name
}
}
class HumanService: BaseService<Human, HumanVM> {}
これらの関係を説明するもう1つの方法は、Protocols with AssociatedTypesを使用することです。あなたのコードは次のようになります:あなたは、私がより適切であると言うことはできません解決しようとしているのか、問題の詳細を知らなくても
protocol Model {}
protocol BaseVM {
associatedtype VMModel : Model
}
protocol BaseService {
associatedtype ServiceVM : BaseVM
}
class Human : Model {
var name = ""
}
class HumanVM : BaseVM {
typealias VMModel = Human
}
class HumanService : BaseService {
typealias ServiceVM = HumanVM
}
。
EDITは、私はまだ、これはMVVMパターンに適用されるか、完全に明確でないんだけど、景色が関与している場合は、UIView
がそれに適合させることができるように、おそらく、あなたはProtocol
ベースのソリューションをしたいと思います。
実際にMVVMパターンを適用しようとしていますが、モデルオブジェクトをカプセル化して、BaseServiceがサーバーにリクエストしてレスポンスを関連するモデルに変換し、関連するビューモデルをモデルオブジェクトで初期化します。 – user2628268
編集を参照してください。特定の質問に関連する詳細をいくつか追加しました。私は、 'プロトコル'アプローチがおそらくもっと自然に適合するだろうと思います。 –