gpt4 book ai didi

swift - swift 3 中的嵌套泛型

转载 作者:搜寻专家 更新时间:2023-11-01 06:35:57 25 4
gpt4 key购买 nike

是否可以在 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。

最佳答案

是的,你可以嵌套泛型。你所拥有的问题是这一行:

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 模式,但如果涉及 View ,您可能需要基于 Protocol解决方案,以便您可以使 UIView 符合它。

关于swift - swift 3 中的嵌套泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com