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

SwiftUI List修改元素时提示item为let常量不可变错误如何解决

问题原因

InfoData 是值类型(struct),List 遍历过程中拿到的 item 是数组元素的只读副本,默认是 let 常量,所以无法直接对其属性做修改操作。

解决方法

有两种常用的实现方案,均兼容Xcode 12 + SwiftUI 2.0的运行环境:

方案1:通过元素ID查找索引修改原数组

直接修改 ObservableObject 中存储的原数组元素,修改后 @Published 会自动触发视图刷新:

struct ContentView: View {
    @StateObject var contentX = ContentX()
    var body: some View {
        List(contentX.infoX) { item in
            HStack {
                Text("\(item.nameX)")
                Spacer()
                Button("+") {
                    // 找到当前元素在原数组中的索引,修改原数据
                    if let index = contentX.infoX.firstIndex(where: { $0.id == item.id }) {
                        contentX.infoX[index].numberX += 1
                    }
                }
                Text("\(item.numberX)")
            }
        }
    }
}

方案2:使用元素绑定简化写法

通过 $ 符号拿到数组元素的绑定引用,直接修改绑定的属性即可同步更新原数组:

struct ContentView: View {
    @StateObject var contentX = ContentX()
    var body: some View {
        List {
            // 遍历数组的绑定,拿到单个元素的绑定
            ForEach($contentX.infoX) { $item in
                HStack {
                    Text(item.nameX)
                    Spacer()
                    Button("+") {
                        item.numberX += 1
                    }
                    Text("\(item.numberX)")
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:09:01