Swift如何访问分组字典内结构体的指定变量并计算单日卡路里总和
实现方案
你的groupedMeals字典结构为[String: [Meal]],每一组的value就是对应日期的所有Meal实例数组,直接对这个数组做字段提取和求和即可,你之前的代码多了一层不必要的内部循环,不需要重复遍历字典的key。
方法1:基础遍历实现(易理解)
// 用来存储最终结果:key是日期,value是当日总卡路里 var dailyTotalCalories: [String: Int] = [:] for (date, meals) in groupedMeals { var total = 0 for meal in meals { // 直接访问Meal的calories_eaten属性累加 total += meal.calories_eaten } dailyTotalCalories[date] = total }
方法2:用高阶函数简化实现(更Swift风格)
直接对每组的Meal数组用reduce方法求和,代码更简洁:
let dailyTotalCalories = groupedMeals.mapValues { meals in meals.reduce(0) { total, meal in total + meal.calories_eaten } } // 还可以进一步简写为: // let dailyTotalCalories = groupedMeals.mapValues { $0.reduce(0, { $0 + $1.calories_eaten }) }
上述代码中的mapValues会对字典每个值(也就是Meal数组)做处理,返回新的字典,key还是原来的日期,value就是对应数组的calories_eaten总和,不需要手动写循环。
补充说明
如果你之前用map访问不到属性,大概率是类型没有匹配上,确认你从Firestore解码得到的实例确实是Meal类型、没有被擦除为Any类型就可以直接访问结构体的存储属性,不需要调用get方法。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

