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