You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:57:00