SwiftUI中让枚举Sheets遵循Identifiable协议的推荐方式?
为枚举实现Identifiable协议的稳定id方案推荐吗?
你最初尝试让Sheets枚举遵循Identifiable协议时,用hashValue作为id但报错,这是因为Swift不再默认提供hashValue属性,除非类型明确遵循Hashable协议。
你后来改用switch返回固定Int的实现方式:
enum Sheets: Identifiable { case add case edit(Product) var id: Int { switch self { case .add: return 1 case .edit(_): return 2 } } }
这种方式确实能生成稳定标识,但是否合适要看你的实际场景:
- 如果你的场景中,所有
.edit案例不需要区分关联的Product(比如仅用来标记弹窗类型,不关心具体编辑哪个产品),那这个方法完全可行,简单直接。 - 但如果需要区分不同
Product对应的.edit实例(比如在SwiftUI列表中展示不同的编辑条目),这个方法就有问题——所有.edit的id都是2,会导致视图无法识别不同的.edit实例,可能出现更新异常。
更通用的推荐方案
如果需要区分同一case下的不同实例,推荐让枚举遵循Hashable协议(因为Product已经是Hashable,编译器会自动合成枚举的Hashable实现),然后直接用枚举自身作为id:
struct Product: Hashable { let name: String let price: Double } enum Sheets: Identifiable, Hashable { case add case edit(Product) var id: Self { self } }
这种方式的好处是:
- 每个枚举实例(包括不同
Product的.edit)都有唯一且稳定的id - 不需要手动维护id的数值,避免后续新增case时忘记更新id
如果坚持要用Int类型的id,也可以借助hashValue(哈希碰撞的可能性极低,一般业务场景下可以忽略):
enum Sheets: Identifiable, Hashable { case add case edit(Product) var id: Int { hashValue } }
内容的提问来源于stack exchange,提问作者Mary Doe
相关产品推荐
相关产品推荐

