是否可以使用泛型在Swift 3中执行以下操作?
class BaseModel {}
class Human : BaseModel {
var name = ""
}
class BaseService<T: BaseVM<BaseModel>> {
//init viewmodel with generic model
}
class BaseVM<T: BaseModel> {}
class HumanVM: BaseVM<Human> {
var name = ""
init(model : Human) {
super.init()
name = model.name
}
}
class HumanService: BaseService<HumanVM> {}
我要做的是使用baseService中的泛型模型初始化viewModel。
答案 0 :(得分:3)
是的,你可以嵌套泛型。你有什么问题就是这一行:
class BaseService<T: BaseVM<BaseModel>> { ...
此处您说BaseService
必须使用继承自BaseVM
通用 IS BaseModel
的类型进行初始化。如果您希望BaseService
能够采用继承自BaseVM
模型继承自BaseModel
的类型,那么您必须这样做:
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> {}
描述这些关系的另一种方法是使用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
}
在不了解您尝试解决的问题的情况下,我不能说哪个更合适。
编辑我还不完全清楚这是如何适用于MVVM模式的,但是如果涉及到视图,您可能需要Protocol
- 基于解决方案,以便您UIView
符合它。