map
Swift中的高階函數(shù)中Map的用途非常廣泛,對(duì)數(shù)組的操作也很方便
舉個(gè)簡(jiǎn)單的例子:
let numbers = [1, 2, 3, 4]
print(numbers.map { $0 * 2 })
###:[2, 4, 6, 8]
對(duì)numbers中的每個(gè)元素進(jìn)行乘以2的操作將會(huì)得到一個(gè)新的數(shù)組注意是新的數(shù)組
那么Map內(nèi)部具體是怎么實(shí)現(xiàn)的呢?
我們來實(shí)現(xiàn)以下(和源碼不太一樣,效果一樣),我擴(kuò)展了Array
func hc_map<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
// 存儲(chǔ)最佳數(shù)組元素?cái)?shù)量(在你數(shù)組元素已知的情況下)
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的使用和可能的內(nèi)部實(shí)現(xiàn)
下面我們看FlatMap
flatMap
首先我們先看flatMap的用法:
print([[1], [2, 3], [4]].flatMap { $0 })
###: [1, 2, 3, 4]
不知道大家發(fā)現(xiàn)沒有,flatMap的作用說白了就是把數(shù)組融合之后再展開得到一個(gè)新的數(shù)組。我們也看一下flatMap的內(nèi)部實(shí)現(xiàn):
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"]
看實(shí)現(xiàn)我們知道,哦,原來map的transform函數(shù)返回的是一個(gè)元素,而flatMap返回的是一個(gè)數(shù)組,然后在for循環(huán)里,result.append是直接用的contentsof參數(shù),所以flatMap才擁有了融合再展開的屬性。
大伙現(xiàn)在明白了嗎?簡(jiǎn)單的用法已到此,歡迎大神指正。