Swift map 的使用记录和理解

2019-08-10  本文已影响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的元素。

上一篇 下一篇

猜你喜欢

热点阅读