SwiftUI中如何更新数组内Struct的属性值?
解决方法
问题原因
ForEach遍历数组时,返回的item是不可变的let常量(哪怕数组本身是var),再加上MonthlyTilt是值类型struct,遍历出来的item只是原数据的副本——直接修改副本属性既不会影响原数组,Swift也不允许修改let常量的属性,因此触发报错。
方案一:通过索引直接修改数组元素
直接遍历数组索引,操作原数组内的元素:
.onAppear { for index in monthlyTilt.indices { // 替换成你的具体计算逻辑,比如根据day值计算degrees monthlyTilt[index].degrees = calculateDegrees(for: monthlyTilt[index].day) } } // 示例计算函数(可按需替换) func calculateDegrees(for day: Int) -> Double { // 这里编写你的计算逻辑 return Double(day) * 0.1 }
方案二:用map生成新数组并重新赋值
通过map方法生成包含修改后元素的新数组,再赋值给原变量:
.onAppear { monthlyTilt = monthlyTilt.map { originalItem in var updatedItem = originalItem updatedItem.degrees = calculateDegrees(for: originalItem.day) // 替换成你的计算逻辑 return updatedItem } }
关键注意点
如果这段代码在SwiftUI视图中,必须确保monthlyTilt是状态变量,否则修改后视图不会自动刷新:
// 在视图结构体中声明 @State private var monthlyTilt = [ MonthlyTilt(month: "Jan", day: 15, degrees: 0.0), MonthlyTilt(month: "Feb", day: 46, degrees: 0.0), // ... 其余月份数据 ]
如果数据来自ViewModel,可结合@Published和ObservableObject使用:
class TiltViewModel: ObservableObject { @Published var monthlyTilt = [MonthlyTilt]() init() { // 初始化数据 monthlyTilt = [ MonthlyTilt(month: "Jan", day: 15, degrees: 0.0), // ... 其余月份数据 ] } } // 在视图中调用 @StateObject private var viewModel = TiltViewModel() .onAppear { viewModel.monthlyTilt = viewModel.monthlyTilt.map { originalItem in var updatedItem = originalItem updatedItem.degrees = calculateDegrees(for: originalItem.day) return updatedItem } }
内容的提问来源于stack exchange,提问作者Edward Hasted
相关产品推荐
相关产品推荐

