Swift Array Run Total to x item

时间:2015-01-31 10:25:17

标签: ios arrays swift reduce running-total

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学习所有可能性)

2 个答案:

答案 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的类型,表示任何子序列 ArrayContiguousArray或其他Slice