Swift中.reduce()无法累加数组所有值?仅输出首个元素问题
问题分析与修复方案
问题1:lazy 属性不会自动更新总和
你定义的 lazy var tipArrayTotal = tipArray.reduce(0, +) 是懒加载属性,它只会在第一次被访问时计算一次总和。之后哪怕 tipArray 里新增了元素,这个变量也不会重新计算,所以你看到数组有新元素,但总和始终是第一次的结果。
问题2:数组存储的是单个数字而非完整小费
你的 addToTip 方法里,每点一个数字键就把单个数字(比如1、5)塞进数组,但实际上你需要的是把每次输入的完整小费金额(比如150)存入数组。现在的逻辑会导致输入15时,数组存[1,5],总和算成6,完全不符合需求。
修复代码
- 把
tipArrayTotal改成计算属性,每次访问都会重新计算数组总和:
// 替换原来的lazy定义 var tipArrayTotal: Int { tipArray.reduce(0, +) }
- 调整数组存储逻辑,只在点击
addToday时存入完整小费:
func addToTip (value: Int) { tip = tip * 10 + value tipAmount.text = String(tip) // 删掉这行:tipArray.append(value) } @IBAction func addToday(_ sender: Any) { // 确保输入的小费大于0再存入数组 if tip > 0 { tipArray.append(tip) } vc.totalTip?.text = String(tipArrayTotal) clearTip() navigationController?.pushViewController(vc, animated: true) print(tipArray) print(tipArrayTotal) }
这样修改后,每次访问tipArrayTotal都会重新计算数组的最新总和,同时数组里存储的是每次输入的完整小费金额,统计结果就会正确了。
内容的提问来源于stack exchange,提问作者cjshhi
相关产品推荐
相关产品推荐

