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 |