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
相关产品推荐
相关产品推荐

