swift 3中的嵌套泛型

时间:2017-01-14 20:08:45

标签: swift generics

是否可以使用泛型在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。

1 个答案:

答案 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符合它。