reduce用法详解

作者: Hollylord | 来源:发表于2015-12-11 14:46 被阅读237次

    基础知识

    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]

    相关文章

      网友评论

        本文标题:reduce用法详解

        本文链接:https://www.haomeiwen.com/subject/vbuyhttx.html