2017-01-14 2 views

Antwort

3

Ja, Sie können Generika verschachteln. Das Problem mit dem, was Sie haben, ist diese Zeile:

class BaseService<T: BaseVM<BaseModel>> { ... 

Sie hier gesagt haben BaseService mit einem Typ initialisiert werden muss, die von BaseVM erbt, deren generische ISBaseModel. Wenn Sie BaseService wollen eine Art zu ergreifen, um der Lage sein, die von BaseVM dessen Modell erbt erbt von BaseModel, dann würden Sie haben es auf diese Weise zu tun:

class BaseService<T: BaseModel, U: BaseVM<T>> { ... 

Hier ist eine Version von dem, was Sie haben darüber kompiliert:

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> {} 

Ein alternativer Ansatz, um diese Beziehungen zu beschreiben, wäre Protocols with AssociatedTypes zu verwenden. Ihr Code würde wie folgt aussehen:

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 
} 

Ohne mehr zu wissen, was Problem, das Sie versuchen, zu lösen ich kann nicht sagen, was besser geeignet ist.

EDIT Ich bin immer noch nicht ganz klar, wie dies mit dem MVVM Muster anwendbar ist, aber wahrscheinlich, wenn Ansichten beteiligt sind, würden Sie eine Protocol -basierte Lösung wollen, so dass Sie könnte UIView, um es anzupassen.

+0

Eigentlich versuche ich, MVVM-Muster anwenden, ich möchte Modellobjekt, BaseService verantwortlich vom Anfordern an Server und Konvertieren von Antwort auf verwandtes Modell und Initialisieren verwandten Ansichtsmodell mit Modellobjekt, – user2628268

+0

meine Bearbeitungen zu kapseln. Ich habe einige weitere Details hinzugefügt, die für die spezifische Frage relevant sind. Ich denke, ein "Protokoll" -Ansatz wäre wahrscheinlich natürlicher. –