Swift有一个很棒的函数.reduce为整个数组提供了一个运行总计:
let array = [1, 2, 3, 4, 5]
let addResult = array.reduce(0) { $0 + $1 }
// addResult is 15
let multiplyResult = array.reduce(1) { $0 * $1 }
// multiplyResult is 120
但是有一种简单的方法可以将它用于一个特定元素的运行总计吗?例如,对于[1,2,3,4,5]的数组,是否有一种方法可以使用.reduce函数返回最多为第3项的运行总计(1 + 2 + 3 = 6)?< / p>
(我知道我总是可以做一个循环,只是尝试用swift学习所有可能性)
答案 0 :(得分:2)
除了使用reduce
数组方法之外,如@ MartinR的答案,还可以使用全局reduce
函数和enumerate
enumerate
函数返回一系列元组,其第一个元素(名为index
)是元素索引,第二个元素(名为element
)是元素值。
因此,您可以使用以下代码获得相同的结果:
let sum = reduce(enumerate(array), 0) {
$0 + ($1.index < 3 ? $1.element : 0)
}
此方法的优点是您可以应用更复杂的规则来排除元素 - 例如,对具有偶数索引的所有元素求和:
let sum = reduce(enumerate(array), 0) {
$0 + ($1.index % 2 == 0 ? $1.element : 0)
}
答案 1 :(得分:1)
reduce()
调用的闭包没有关于
目前的指数。
从理论上讲,可以创建一个闭包
使用捕获的变量来记住&#34;它的频率被称为:
func addFirst(var count : Int) -> (Int, Int) -> Int {
return {
count-- > 0 ? $0 + $1 : $0
}
}
let array = [1, 2, 3, 4, 5]
let sumOfFirstThreeItems = array.reduce(0, addFirst(3) )
但是这仍然会在整个阵列上运行,而不仅仅是 前3个元素。没有办法停止&#34;这个过程。
更简单的方法是在数组切片上操作:
let array = [1, 2, 3, 4, 5]
let sumOfFirstThreeItems = array[0 ..< 3].reduce(0) { $0 + $1 }
切片是类似Array
的类型,表示任何子序列
Array
,ContiguousArray
或其他Slice
。