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<T>(_ 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<T>(_ 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才拥有了融合再展开的属性。
大伙现在明白了吗?简单的用法已到此,欢迎大神指正。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容