SwiftUI中如何使用ForEach遍历自定义LinkedList链表节点
问题原因
- SwiftUI 的
ForEach要求传入的数据集遵循RandomAccessCollection协议,你当前的CPU仅实现了Sequence协议,只支持普通的 for-in 遍历,无法被ForEach直接识别。 - 你使用
\.self作为元素标识,要求元素Core遵循Hashable协议,你当前没有实现该协议。 - 额外注意:
Core是引用类型,修改它的属性不会触发CPU结构体的属性变更通知,@Published默认不会发送刷新事件,视图不会自动更新。
解决方案
方案1:最简适配(无需修改原有数据结构)
直接把链表转为数组传入 ForEach 即可,Core 已经实现了 Identifiable 协议,可以直接用内置的 id 作为标识,不需要手动实现 Hashable:
struct ContentView: View { @ObservedObject var test = Test() var body: some View { VStack{ // 把Sequence转成Array即可适配ForEach ForEach(Array(test.cpu)) { core in Text("核心\(core.id) 温度:\(core.tmp) 频率:\(core.clocks) 负载:\(core.load)") } } } }
方案2:实现Hashable协议(如果你坚持要用\.self作为标识)
给 Core 加扩展实现 Hashable:
extension Core: Hashable { static func == (lhs: Core, rhs: Core) -> Bool { lhs.id == rhs.id } func hash(into hasher: inout Hasher) { hasher.combine(id) } }
依然建议搭配转数组的写法使用。
引用类型刷新问题修复
因为 Core 是引用类型,修改它的属性时需要手动触发视图刷新:
// 任何修改Core属性的代码执行完成后,调用下面的方法触发刷新 test.objectWillChange.send()
内容的提问来源于stack exchange,提问作者Vankurua
相关产品推荐
相关产品推荐

