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

SwiftUI中如何使用ForEach遍历自定义LinkedList链表节点

问题原因

  1. SwiftUI 的 ForEach 要求传入的数据集遵循 RandomAccessCollection 协议,你当前的 CPU 仅实现了 Sequence 协议,只支持普通的 for-in 遍历,无法被 ForEach 直接识别。
  2. 你使用 \.self 作为元素标识,要求元素 Core 遵循 Hashable 协议,你当前没有实现该协议。
  3. 额外注意: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:45:05