Swift map/flatMap/compactMap 傻傻分不清楚

1,133 阅读2分钟

map:

  • map 将对象取出,做了一定操作之后,作为输入源,传递给转换闭包
  • 闭包处理之后,返回处理结果
  • map 将输出结果做了一定操作之后,返回给调用者

输入源/转换方式/输出结果,这三个中,转换方式是不能被函数控制的,所以 map/flatMap/compactMap 分别是对 输入源/输出结果 不同的处理方式 的描述。

集合的 map 定义

func map<T>(_ transform: (Elements.Index) -> T) -> [T]

func flatMap<SegmentOfResult>(_ transform: (Elements.Index) -> SegmentOfResult) -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

func compactMap<ElementOfResult>(_ transform: (Element) -> ElementOfResult?) -> [ElementOfResult]

集合对输入都没有做特殊处理,集合中的元素是什么,就传进去什么。

map

会直接将输出结果组合成集合,比如转化闭包分别返回 1, 2;则返回值就是 [1, 2]

map 取对象时,把集合脱掉了一层 [ ],返回时,将输出结果又包上了一层 [ ],也就是说做了一次逆操作。

flatMap

会在 map 结果的基础上,去掉一层 [ ],更形象说是把集合压平,(要求 transform 转化出来是集合)

比如转化闭包分别返回[1], [2], 则返回值就是 [1, 2]

compactMap

会过滤掉输出结果中的 nil

比如转化闭包分别返回 1, nil,则返回值是 [1]

Optional 的 map 定义

func map<U>(_ transform: (Wrapped) -> U) -> U?

func flatMap<U>(_ transform: (Wrapped) -> U?) -> U?

可选值将会过滤掉 nil 的对象,也就是说如果可选值为 nil,将不会调用转化函数

map

将会把输出结果再包上一层 Optional(一次逆操作)

compactMap

会在 map 返回结果的基础上,去掉一层 Optional

总结

map flatMap compactMap
集合 原样输出 去掉一层集合 过滤掉 nil
可选值 原样输出 没有 去掉一层 Optional