如何简化SwiftUI View结构体中冗长的泛型定义语法?
最优优化方案:将Hashable约束下沉到协议层
你所有实现对应协议的模型本身已经遵守了Hashable,直接把Hashable约束附加到协议定义上,就可以完全去掉泛型声明后冗长的where子句。
步骤1:修改各数据协议的声明,新增Hashable约束
以你给出的两个协议为例:
ModelGif.swift 调整后:
// 直接在协议继承链上加Hashable protocol ModelGifProtocol: Codable, Hashable { var gif: GifType { get } }
ModelMagicText.swift 调整后:
// 直接在协议继承链上加Hashable protocol ModelMagicTextProtocol: Codable, Hashable { var id: UUID { get } var context: String { get } init(_ context: String, id: UUID) throws init(_ context: String) throws }
剩下的ModelFontProtocol、ModelPreSetAnswerProtocol做相同修改,统一加上Hashable约束即可。
步骤2:简化视图泛型声明
修改完成后,原来的视图声明可以直接简化为:
struct ViewUserSettings<TypeGif: ModelGifProtocol, TypeFont: ModelFontProtocol, TypeMagicText: ModelMagicTextProtocol, TypePreSetAnswer: ModelPreSetAnswerProtocol>: View
原有功能完全不受影响,编译器也不会再抛出ForEach相关的Hashable错误。
备选方案:用类型别名封装组合约束
如果出于架构规范要求,不能修改原有协议的基础约束,可以用类型别名把每个协议加Hashable的组合约束打包,简化泛型声明:
// 提前定义组合约束别名 typealias HashableGifModel = ModelGifProtocol & Hashable typealias HashableFontModel = ModelFontProtocol & Hashable typealias HashableMagicTextModel = ModelMagicTextProtocol & Hashable typealias HashablePreSetAnswerModel = ModelPreSetAnswerProtocol & Hashable // 视图声明简化为 struct ViewUserSettings<TypeGif: HashableGifModel, TypeFont: HashableFontModel, TypeMagicText: HashableMagicTextModel, TypePreSetAnswer: HashablePreSetAnswerModel>: View
内容的提问来源于stack exchange,提问作者OguzYuksel
相关产品推荐
相关产品推荐

