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

如何对过滤后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:40:15