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

SwiftUI中Picker绑定枚举后仅首次修改有效问题求助

问题原因

你的Day结构体自定义了Equatable和Hashable实现,只将id作为相等判断和哈希计算的依据。当修改Day的type属性时,虽然对象内容发生了变化,但因为id未改变,SwiftUI的ForEach无法感知到数组元素的更新,导致后续的Picker选择操作无法触发视图刷新和数据更新。

解决方案

移除自定义的Equatable和Hashable实现,让Swift自动合成这两个协议的实现。这样合成的逻辑会包含结构体的所有属性(id、type、workout),当type变化时,元素的哈希值会同步改变,ForEach就能正确识别到数组元素的更新,Picker也能正常响应选择操作。

修改后的代码

Day结构体(移除自定义Equatable/Hashable)

struct Day: Identifiable, Codable, Hashable, Equatable {
    var id: Int // 1 - 7
    var type: DayType
    var workout: [Workout]?
    
    init(id: Int) {
        self.id = id
        self.type = .rest
        self.workout = [Workout]()
    }
    
    enum CodingKeys: String, CodingKey {
        case id
        case type
        case workout
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        id = try values.decode(Int.self, forKey: .id)
        type = try values.decode(DayType.self, forKey: .type)
        
        if values.contains(.workout) {
            workout = try values.decode([Workout]?.self, forKey: .workout)
        } else {
            workout = nil
        }
    }
}

补充说明

如果你的Workout结构体也未实现Hashable/Equatable,需要确保它也符合这两个协议(同样可以让Swift自动合成),否则Day的自动合成会失败。

内容的提问来源于stack exchange,提问作者Nick Molargik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:33:37