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

