SwiftUI中CoreData一对多关系下计算并展示所有Depot实体总价值的问题
解决所有Depot总价值的计算与展示问题
没问题,我来帮你搞定这个所有Depot总价值的计算和展示需求~
你已经实现了单个Depot的价值求和,现在只需要对所有FetchedResults<Depot>的结果做一次累加就可以了。具体步骤如下:
1. 添加总价值计算属性
在你的Portfolio结构体里,新增一个计算属性来计算所有Depot的总价值:
struct Portfolio: View { // 保留你原有的所有属性和代码... // 新增:计算所有Depot的总价值 private var totalPortfolioValue: Double { // 遍历所有depots,累加每个depot的sumOfDepot结果 depots.reduce(0.0) { accumulatedValue, depot in accumulatedValue + depot.sumOfDepot() } // 简化写法也可以写成:depots.reduce(0) { $0 + $1.sumOfDepot() } } // 你的body部分... }
2. 在视图中展示总价值
接下来,你可以在现有视图的合适位置(比如列表上方)添加总价值的展示,比如:
var body: some View { VStack(alignment: .leading) { // 新增:展示总组合价值 HStack { Text("Total Portfolio Value") .font(.subheadline) .foregroundColor(.secondary) Spacer() Text("\(totalPortfolioValue as NSNumber, formatter: formatter) €") .font(.title2) .fontWeight(.semibold) } .padding(.horizontal, g.size.width / 40) .padding(.bottom, 12) // 你原有的ScrollView列表部分 ScrollView(showsIndicators: false) { Color.clear .padding(.bottom, g.size.height / -200) ForEach(depots) { depot in // 保留你原有的每个Depot的视图代码... } } } }
原理说明
reduce方法会从初始值0.0开始,依次将每个depot的sumOfDepot()结果累加到总和中,最终得到所有Depot的总价值。- 这个计算属性是实时更新的:当CoreData中的Depot或其关联的Aktien数据发生变化时,
depots的FetchedResults会自动刷新,totalPortfolioValue也会随之重新计算。
这样就能轻松实现你需要的所有Depot总价值展示啦~
内容的提问来源于stack exchange,提问作者SPR
相关产品推荐
相关产品推荐

