如何将类的公共属性泛型化?适配树形结构多模型类方案咨询
解决方案:用泛型基类统一树形模型结构
嘿,我来帮你搞定这个泛型化的问题!你现在的四个树形模型共享一堆重复属性,还得处理层级关联,原来的代码里用if let强转类型的写法不仅冗余,还容易出错。咱们用泛型基类来重构,既能消除重复代码,又能保证类型安全。
第一步:提取公共属性到泛型基类
首先,把所有模型都有的name、value、amounts,还有你提到的avg、id、子模型引用,全部封装到一个泛型基类里。这里用泛型<Child>来标记当前模型对应的子模型类型,最底层的模型(比如你的D类/ListOfWeeks)可以用Never来表示“没有子模型”,语义更清晰:
class BaseTreeModel<Child> { // 所有模型共享的公共属性 var name: String? var value: Int? var amounts: [Double?] // 你自定义的额外属性 var avg: Double? var id: String! // 子模型引用,根据你的示例是单个可选对象,要是你需要列表就改成[Child] var subModel: Child? // 统一初始化方法,避免每个子类重复写初始化逻辑 init(name: String? = nil, value: Int? = nil, amounts: [Double?] = [], subModel: Child? = nil) { self.name = name self.value = value self.amounts = amounts self.subModel = subModel } }
第二步:快速定义具体模型类
现在每个具体模型只需要继承这个泛型基类,指定对应的子模型类型就行,不用再重复写那些公共属性——是不是清爽多了?
// 对应你的A类/ListOfYears,子模型是ListOfMonths class ListOfYears: BaseTreeModel<ListOfMonths> {} // 对应你的B类/ListOfMonths,子模型是ListOfWeeks class ListOfMonths: BaseTreeModel<ListOfWeeks> {} // 对应你的C类/ListOfWeeks,子模型是ListOfDays class ListOfWeeks: BaseTreeModel<ListOfDays> {} // 对应你的D类/ListOfDays,没有子模型,用Never标记 class ListOfDays: BaseTreeModel<Never> {}
如果你的子模型是列表类型(比如listOfB: [B]),只需要把基类里的subModel改成[Child],初始化方法里对应调整参数就行,子类写法不变。
第三步:通用处理类(替代你的GenericModel)
现在你需要的通用处理逻辑,完全可以用泛型约束来实现,再也不用写一堆if let强转了。比如写一个通用的处理器,能处理任意BaseTreeModel类型的模型:
class TreeModelProcessor<T: BaseTreeModel<Any>> { func updateModel(_ model: T, withAvg newAvg: Double?, newId: String) { model.avg = newAvg model.id = newId // 如果需要递归处理子模型,也能轻松实现,因为子模型也是BaseTreeModel的子类 if let subModel = model.subModel as? any BaseTreeModel<Any> { updateModel(subModel as! T, withAvg: newAvg, newId: newId) } } } // 用起来也很简单 let yearModel = ListOfYears(name: "2024", value: 2024, amounts: [120.5, 90.0]) let processor = TreeModelProcessor<ListOfYears>() processor.updateModel(yearModel, withAvg: 105.25, newId: "year_2024")
为什么这比你原来的写法好?
- 零重复代码:所有公共属性和初始化逻辑都在基类里,子类只需要管自己的层级关系
- 类型安全:编译时就能检查类型错误,再也不会出现强转失败的隐患
- 扩展性拉满:以后新增模型类,只需要继承
BaseTreeModel指定子类型就行,完全不用修改处理器代码
内容的提问来源于stack exchange,提问作者Saranjith
相关产品推荐
相关产品推荐

