基础知识
Reduce 的基础思想是将一个序列转换为一个不同类型的数据,期间通过一个累加器(Accumulator)来持续记录递增状态。
func reduce<T>(initial: T, combine: (T, Self.Generator.Element) -> T) -> T
func combinator(accumulator: Int, current: Int) -> Int {
return accumulator + current
}
[1, 2, 3].reduce(0, combine: combinator)
// 执行步骤如下
combinator(0, 1) { return 0 + 1 } = 1
combinator(1, 2) { return 1 + 2 } = 3
combinator(3, 3) { return 3 + 3 } = 6
= 6
初始值0会跟数组第一个元素运算,成为累加值,然后这个值在与数组第二个元素运算成为第二个累加值,以此类推,返回最后的结果。
实际用法
func rmap(elements: [Int], transform: (Int) -> Int) -> [Int] {
return elements.reduce([Int](), combine: { (var acc: [Int], obj: Int) -> [Int] in
acc.append(transform(obj))
return acc })
}
print(rmap([1, 2, 3, 4], transform: { $0 * 2}))
// [2, 4, 6, 8]
combine这个闭包有2个参数,$1表示每次运算的累加值,这个值也是最后要返回的,所以返回的类型也必须跟它保持一致;$2是便利数组后当前参与运算的一个数组元素。
分解上式代码:
- 初始值$1 = 空数组[];当前值$2 = 1,数组的第一个元素。把$2添加到$1里面并返回$1 = [1]
- 累加值$1 = [1],当前值$2 = 2,数组第二个元素。把$2添加到$1里面并返回$1 = [1,2]
- 以此类推,返回最终结果为[2, 4, 6, 8]
网友评论