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

SwiftUI中@State修饰结构体数组嵌套属性修改仅首次生效问题

问题原因

问题出在你自定义的Can结构体Equatable协议实现上:

  • 你编写的==判断逻辑仅对比两个Can实例的id属性,而id是初始化后就不会变化的常量
  • 调用liste[0].nested.change()修改嵌套的property属性时,Can实例的实际值已经发生了变化,但自定义的相等判断逻辑忽略了nested属性的变动,SwiftUI检测不到实例发生了变更,就不会触发视图重新渲染,因此看不到后续的数值更新。首次点击能看到变化是因为@State首次接收到写入操作触发了初始刷新,后续修改均被错误的相等判断拦截。

修复方案

二选一即可:

  • 方案1:删除自定义的Equatable、Hashable实现,让编译器自动合成判断逻辑,会自动对比所有存储属性的变化,适配当前需求
    struct Can: Identifiable, Equatable, Codable, Hashable {
        let id = UUID()
        var nested = nestedThingies()
        
        struct nestedThingies: Codable, Equatable, Hashable {
            var property = 15
            mutating func change(){
                property -= 1
            }
        }
    }
    
  • 方案2:如果必须自定义相等判断规则,就把nested属性也加入判断和哈希计算逻辑:
    static func == (lhs: Can, rhs: Can) -> Bool {
        lhs.id == rhs.id && lhs.nested == rhs.nested
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
        hasher.combine(nested)
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:10