ist es möglich, in Swift 3 mit Generika zu tun?verschachtelte Generika in Swift 3
was ich versuche zu tun ist die Initialisierung von ViewModel mit generischen Modell in BaseService.
ist es möglich, in Swift 3 mit Generika zu tun?verschachtelte Generika in Swift 3
was ich versuche zu tun ist die Initialisierung von ViewModel mit generischen Modell in BaseService.
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.
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
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. –