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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:54:41