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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:40:24