在 swift 中的 for 循环中对对象数组的元素求和:Sum 变量不保留值?
Sum elements of an array of objects in a for loop in swift: Sum variable not retaining value?
我写了我认为是一个基本函数来总结数组的值并计算预算中剩余的金额。我使用 for 循环对数组的元素求和,然后从预算中减去该值。但是,出于某种原因,sum 的值在 for 循环中正确更新,但 for 循环外的 sum 值始终为零。下面的 println "Sum in the loop" 是正确的,但是 println "Sum is" 总是等于 0。 dataModel.spendingDataDisplay 是一个对象数组。谢谢你的帮助。
func amountLeftToSpend ()->Double {
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
var sum = spendingItem.amountSpent + sum
println("Spending Item .amountSpent\(spendingItem.amountSpent)")
println("Sum in the loop is \(sum)")
}
println("Sum is \(sum)")
let amountLeftInBudget = dataModel.settingsData.weeklyBudget - sum
println("Amount Left in Budget is \(amountLeftInBudget)")
return amountLeftInBudget
}
看起来您正在更新 for 循环内的局部变量 sum
,而不是在循环外声明为 Double 的变量。这就是 "Sum is" 始终为 0 的原因。根据您的代码,我实际上不确定 "Sum in the loop" 是如何正确的,但我对 Swift 不是很好。
我认为你需要改变
var sum = spendingItem.amountSpent + sum
只是 sum += spendingItem.amountSpent
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
var sum = spendingItem.amountSpent + sum
在第三行你重新声明了变量sum
。它应该是:
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
sum = spendingItem.amountSpent + sum
我也不确定它是否真的有效...
有趣的是,我们只在其函数上下文之外收到编译器警告
您可以使用 reduce
函数来避免此类错误。
func amountLeftToSpend ()->Double {
let sum = reduce(dataModel.spendingDataDisplay, 0.0) { [=10=] + .amountSpeed }
println("Sum is \(sum)")
let amountLeftInBudget = dataModel.settingsData.weeklyBudget - sum
println("Amount Left in Budget is \(amountLeftInBudget)")
return amountLeftInBudget
}
正如其他人所指出的,您有两个 sum
变量。所以你可以通过消除内部 var
引用来解决这个问题:
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
sum += spendingItem.amountSpent
}
另外,如果spendingDataDisplay
是一个Swift数组,你也可以使用reduce
方法:
let sum = dataModel.spendingDataDisplay.reduce(0.0) { [=11=] + .amountSpent }
我写了我认为是一个基本函数来总结数组的值并计算预算中剩余的金额。我使用 for 循环对数组的元素求和,然后从预算中减去该值。但是,出于某种原因,sum 的值在 for 循环中正确更新,但 for 循环外的 sum 值始终为零。下面的 println "Sum in the loop" 是正确的,但是 println "Sum is" 总是等于 0。 dataModel.spendingDataDisplay 是一个对象数组。谢谢你的帮助。
func amountLeftToSpend ()->Double {
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
var sum = spendingItem.amountSpent + sum
println("Spending Item .amountSpent\(spendingItem.amountSpent)")
println("Sum in the loop is \(sum)")
}
println("Sum is \(sum)")
let amountLeftInBudget = dataModel.settingsData.weeklyBudget - sum
println("Amount Left in Budget is \(amountLeftInBudget)")
return amountLeftInBudget
}
看起来您正在更新 for 循环内的局部变量 sum
,而不是在循环外声明为 Double 的变量。这就是 "Sum is" 始终为 0 的原因。根据您的代码,我实际上不确定 "Sum in the loop" 是如何正确的,但我对 Swift 不是很好。
我认为你需要改变
var sum = spendingItem.amountSpent + sum
只是 sum += spendingItem.amountSpent
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
var sum = spendingItem.amountSpent + sum
在第三行你重新声明了变量sum
。它应该是:
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
sum = spendingItem.amountSpent + sum
我也不确定它是否真的有效...
有趣的是,我们只在其函数上下文之外收到编译器警告
您可以使用 reduce
函数来避免此类错误。
func amountLeftToSpend ()->Double {
let sum = reduce(dataModel.spendingDataDisplay, 0.0) { [=10=] + .amountSpeed }
println("Sum is \(sum)")
let amountLeftInBudget = dataModel.settingsData.weeklyBudget - sum
println("Amount Left in Budget is \(amountLeftInBudget)")
return amountLeftInBudget
}
正如其他人所指出的,您有两个 sum
变量。所以你可以通过消除内部 var
引用来解决这个问题:
var sum:Double = 0.0
for spendingItem in dataModel.spendingDataDisplay {
sum += spendingItem.amountSpent
}
另外,如果spendingDataDisplay
是一个Swift数组,你也可以使用reduce
方法:
let sum = dataModel.spendingDataDisplay.reduce(0.0) { [=11=] + .amountSpent }