SwiftUI中如何提取数组唯一地点并统计各位置扑克对局总盈利
实现方法
你可以通过Swift集合自带的分组、聚合操作实现去重地点+统计总盈利的需求,步骤如下:
- 先在你的ViewModel中新增用于展示的地点盈利汇总计算属性,你可以先定义一个轻量的Identifiable结构体用于承载汇总数据,方便ForEach遍历:
// 汇总数据结构,也可以直接用元组,但用Identifiable结构体更适合SwiftUI列表遍历 struct LocationProfit: Identifiable { let id = UUID() let location: String let totalProfit: Int } // ViewModel中新增计算属性 var locationProfits: [LocationProfit] { // 按location字段分组所有对局 Dictionary(grouping: sessions, by: \.location) // 遍历每个分组,统计该地点总盈利 .map { location, sessionsInLocation in LocationProfit( location: location, // reduce累加该分组所有对局的profit字段 totalProfit: sessionsInLocation.reduce(0, { $0 + $1.profit }) ) } // 可选配置:按总盈利从高到低排序 .sorted { $0.totalProfit > $1.totalProfit } }
- 替换原有列表的遍历数据源,同时动态渲染总盈利(新增盈利为负时显示红色的优化):
List { ForEach(viewModel.locationProfits) { profitItem in HStack { Text(profitItem.location) Spacer() Text("$\(profitItem.totalProfit)") .bold() .foregroundColor(profitItem.totalProfit >= 0 ? .green : .red) } } } .navigationBarTitle(Text("Profit by Location"))
实现原理
Dictionary(grouping:by:)会自动将所有对局按location字段分组,天然保证了地点不会重复reduce方法会遍历每个地点的所有对局记录,累加profit字段得到该地点的总盈利
内容的提问来源于stack exchange,提问作者comexbackkid
相关产品推荐
相关产品推荐

