Swift Map和FlatMap

map

Swift中的高阶函数中Map的用途非常广泛,对数组的操作也很方便
举个简单的例子:

let numbers = [1, 2, 3, 4]
print(numbers.map { $0 * 2 })
###:[2, 4, 6, 8]

对numbers中的每个元素进行乘以2的操作将会得到一个新的数组注意是的数组
那么Map内部具体是怎么实现的呢?
我们来实现以下(和源码不太一样,效果一样),我扩展了Array

func hc_map(_ transform: (Element) -> T) -> [T] {
     var result: [T] = []
     // 存储最佳数组元素数量(在你数组元素已知的情况下)
     result.reserveCapacity(count)
     for x in self {
         result.append(transform(x))
     }
     return result
}
print([1, 2 ,3 ,4].hc_map { $0 * 3 })
###: [3, 6, 9, 12]

以上就是map的使用和可能的内部实现

下面我们看FlatMap

flatMap

首先我们先看flatMap的用法:

print([[1], [2, 3], [4]].flatMap { $0 })
###: [1, 2, 3, 4]

不知道大家发现没有,flatMap的作用说白了就是把数组融合之后再展开得到一个新的数组。我们也看一下flatMap的内部实现:

extension Array {
    func hc_flatMap(_ transform: (Element) -> [T]) -> [T] {
        var result: [T] = []
        for x in self {
            result.append(contentsOf: transform(x))
        }
        return result
    }
}
print([["a"], ["b", "c"], ["d"]].hc_flatMap { $0 })
###: ["a", "b", "c", "d"]

看实现我们知道,哦,原来map的transform函数返回的是一个元素,而flatMap返回的是一个数组,然后在for循环里,result.append是直接用的contentsof参数,所以flatMap才拥有了融合再展开的属性。
大伙现在明白了吗?简单的用法已到此,欢迎大神指正。

你可能感兴趣的:(Swift Map和FlatMap)