如何对过滤后的OutsideIncome数组中Int类型字段求和?
解决方案:计算OutsideIncome数组中指定用户的收入总和
首先,你的方向完全没错——用filter+reduce或者map+reduce确实能简洁解决问题,核心是先把每个OutsideIncome对象的Int字段总和封装好,再做累加。
第一步:给OutsideIncome添加计算属性(关键优化)
先给你的OutsideIncome结构体加一个计算属性,用来返回单个对象所有Int字段的总和,这样后续不管哪里需要用到这个总和,都不用重复写一堆加法:
struct OutsideIncome { let userName: String let allOthers: Int let babysitting: Int let houseCleaning: Int let mowingLawns: Int let summerJobs: Int // 计算属性:返回当前对象所有收入项的总和 var totalIncome: Int { return allOthers + babysitting + houseCleaning + mowingLawns + summerJobs } }
第二步:用Filter+Reduce实现简洁求和
有了上面的计算属性,接下来筛选目标用户并累加总和就非常简单了:
let currentUserName = "Beth" let incomeArray = [ OutsideIncome(userName: "Beth", allOthers: 1, babysitting: 0, houseCleaning: 0, mowingLawns: 0, summerJobs: 0), OutsideIncome(userName: "Molly", allOthers: 0, babysitting: 50, houseCleaning: 30, mowingLawns: 20, summerJobs: 100) ] // 筛选出当前用户的对象,然后累加它们的totalIncome let totalOutsideIncome = incomeArray .filter { $0.userName == currentUserName } .reduce(0) { $0 + $1.totalIncome } print(totalOutsideIncome) // 输出1
分析你之前尝试的代码问题
- #1 FOR LOOP:这里的错误在于
reduce已经直接返回了一个Int类型的总和,而不是数组,所以你不能用for item in ...来遍历它,逻辑完全搞反了。 - #2 FILTER REDUCE:
reduce的闭包里你直接写$0 + $1,但$1是OutsideIncome对象,不是Int值,Swift不知道怎么把两个对象相加,所以报错。 - #3 FILTER:这个方法能运行,但不仅繁琐,还用到了强制解包
!,如果数组里找不到目标用户,会直接崩溃,非常不安全。
你的最终代码小修正
看你更新的最终代码里有个小问题:array.filter({ $0.userName == user.firstName })里的user.firstName应该是你定义的currentUserName,修正后就完美了。
内容的提问来源于stack exchange,提问作者Phontaine Judd
相关产品推荐
相关产品推荐

