美文网首页
Swift map 的使用记录和理解

Swift map 的使用记录和理解

作者: 黑羽肃霜 | 来源:发表于2019-08-10 13:26 被阅读0次

    综述

    map 方法是 swift 提供的一种遍历多元素的方式 (数组,字典,set 等).

    本质上是 sequence 协议的一种扩展。符合函数式编程。(函数式编程思想贯穿于 swift 中 )

    简单理解

    map 顾名思义就是映射。你可以把它看成一个 y = f(x). 针对序列中的每个元素做映射操作得到一个新的序列。

    let c = [1: "1", 2: "2"].map(transform: ((key: Int, value: String)) throws -> T)

    深入理解

    官方提供的 Sequence 协议扩展中其实已经实现了 map, reduce, filter 的功能

    extension Sequence {
      func map<T>(_ transform: @noescape (Self.Iterator.Element) throws -> T) rethrows -> [T]
      func filter(_ isIncluded: @noescape (Self.Iterator.Element) throws -> Bool) rethrows -> [Self.Iterator.Element]
      func reduce<Result>(_ initialResult: Result, _ nextPartialResult: @noescape (partialResult: Result, Self.Iterator.Element) throws -> Result) rethrows -> Result
    }
    

    下面这段摘自喵神的 《函数式 Swift》,是一个自己实现的 map 方法。

    extension Array {
    
      func map<T>(_ transform: (Element) -> T) -> [T] {
        var result: [T] = []
        for x in self {
          result.append(transform(x)) 
        }
        
        return result 
      }
    }
    

    这个数组拓展的 map 方法可以看出, transform 是一个闭包(可以认为就是上面提到的 y = f(x)),作用是取出数组中的单个元素进行映射转换。转换的结果是 y,也就是新数组中的元素。这里之所以使用了泛型,是为了兼容任意的输出。例如,我传入一个 [Int] 需要输出一个 [String] 或其他类型。

    $0 到底是个什么东西

    简单来说, $0 是一种用来替换闭包的写法。如下面这个例子:

    let array2 = array.map { (number: Int) -> Int in
        return number + number
    }
    // 或
    let array2 = array.map {
        return $0 + $0
    }
    
    

    $0 对应的就是闭包中的第一个参数。
    如果一个闭包 typealias Closure = (_ firstParam: Int, _ secondParam: Int) -> () 有两个元素,那么在实际调用时

    $0 代表 firstParam, $1 代表 secondParam。可以认为 $0 是必要调用的一种简化方式。

    map 和 flatmap

    直接上文章吧。 参考文章

    简单的理解:从语法上,你可以这么理解,flatMap 就是先使用 map处理数组,接着将结果数组“压平”(顾名思义),也就是从输出数组里剔除值为nil的元素。

    相关文章

      网友评论

          本文标题:Swift map 的使用记录和理解

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