Swift 提供了如下幾個(gè)高階函數(shù):map
割去、flatMap
宦搬、filter
、reduce
劫拗。使用高階函數(shù)進(jìn)行函數(shù)式編程不僅可以簡(jiǎn)化我們的代碼间校,而且當(dāng)數(shù)據(jù)比較大的時(shí)候,高階函數(shù)會(huì)比傳統(tǒng)實(shí)現(xiàn)更快页慷。
一憔足、map 函數(shù)
map
方法獲取一個(gè)閉包表達(dá)式作為其唯一參數(shù)。然后它會(huì)遍歷整個(gè)數(shù)組酒繁,并對(duì)數(shù)組中每一個(gè)元素執(zhí)行閉包中的操作滓彰,并返回該元素所映射的值。
簡(jiǎn)單說(shuō)就是州袒,數(shù)組中每個(gè)元素通過(guò)某個(gè)方法進(jìn)行轉(zhuǎn)換揭绑,最后返回一個(gè)新的數(shù)組。
示例1:將數(shù)組中的數(shù)字郎哭,全部轉(zhuǎn)換為字符串
let prices = [1, 2, 3, 4]
let priceStr = prices.map { (n) -> String in
return "價(jià)格:\(n)"
}
print(priceStr) // ["價(jià)格:1", "價(jià)格:2", "價(jià)格:3", "價(jià)格:4"]
注:在閉包中他匪,可以用$0
表示第 0 個(gè)參數(shù),$1
表示第 1 個(gè)參數(shù)夸研,以此類推邦蜜;若返回值只有一句,則可以省略return
亥至,所以上面的代碼可以簡(jiǎn)化為:
let prices = [1, 2, 3, 4]
let priceStr = prices.map { "價(jià)格\($0)" }
print(priceStr) // ["價(jià)格:1", "價(jià)格:2", "價(jià)格:3", "價(jià)格:4"]
示例2:對(duì)一個(gè)數(shù)組里面的數(shù)據(jù)進(jìn)行平方操作
let values = [5, 6, 7]
let squares = values.map { $0 * $0 }
print(squares) // [25, 36, 49]
二 flatMap 函數(shù)
flatMap
方法同 map
方法比較類似悼沈,只不過(guò)它返回后的數(shù)組中不存在 nil(自動(dòng)把 nil 給剔除掉)贱迟,同時(shí)它會(huì)把 Optional 解包。
// 示例1:
let names = ["Jack", "Rose", nil, "AnyBody"]
let names1 = names.flatMap { $0 }
print(names1) // 輸出時(shí)絮供,會(huì)自動(dòng)剔除nil衣吠,結(jié)果:["Jack", "Rose", "AnyBody"]
// 示例2:
let names = ["Jack", "Rose", "AnyBody"]
let names2 = names.flatMap { (name) -> String? in
return name
}
print(names2) // 結(jié)果與示例1相同
// 示例3:
let names = ["Jack", "Rose", "AnyBody"]
let names3 = names.flatMap { (name) -> String in
return name
}
print(names3) // 結(jié)果: ["J", "a", "c", "k", "R", "o", "s", "e", "A", "n", "y", "B", "o", "d", "y"]
特別注意:如果 faltMap
閉包的返回值不是可選型(示例3),可能會(huì)有意想不到的結(jié)果壤靶。
同時(shí)缚俏,flatMap
還能把數(shù)組中存有數(shù)組的數(shù)組(二維數(shù)組、N維數(shù)組)一同打開(kāi)變成一個(gè)新的數(shù)組萍肆。
let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let arr1 = array.map { $0 } // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let arr2 = array.flatMap { $0 } // [1, 2, 3, 4, 5, 6, 7, 8, 9]
小結(jié):map
和 flatMap
區(qū)別,map
函數(shù)值對(duì)元素進(jìn)行變換操作胀屿。 但不會(huì)對(duì)數(shù)組的結(jié)構(gòu)造成影響塘揣。 而 flatMap
會(huì)影響數(shù)組的結(jié)構(gòu)。
在 Swift 4 時(shí)宿崭,flatMap
函數(shù)過(guò)時(shí)了,取而代之的是compactMap(_:)
,其用法與flatMap
一致趾疚,只是改了名字而已立膛,不再贅述。
三讹堤、filter 函數(shù)
filter
方法用于過(guò)濾元素吆鹤,即篩選出數(shù)組元素中滿足某種條件的元素。
// 篩選出金額大于 25 的元素洲守。
let prices = [20, 30, 40]
let result = prices.filter { $0 > 25 }
print(result) // [30, 40]
四疑务、reduce 函數(shù)
reduce
方法把數(shù)組元素組合計(jì)算為一個(gè)值,并且會(huì)接受一個(gè)初始值梗醇,這個(gè)初始值的類型可以和數(shù)組元素類型不同知允。
示例1:計(jì)算數(shù)組元素的乘積
let prices = [20, 30, 40]
let result = prices.reduce(1) { $0 * $1 }
print(result) // 24000
上面的方法的第二行還可以簡(jiǎn)寫成:
let result = prices.reduce(1, *)
示例2:將數(shù)組轉(zhuǎn)成字符串,每個(gè)元素用頓號(hào)叙谨、
隔開(kāi)温鸽。
let array = ["Apple", "Orange", "Grape"]
let str = array.reduce("") { $0 == "" ? $1 : $0 + "、" + $1 }
print(str) // Apple手负、Orange涤垫、Grape
也可以簡(jiǎn)寫為:
let str = array.joined(separator: "、") // Apple竟终、Orange雹姊、Grape