高階函數map,flatMap,reduce,filter可以簡化代碼量, 能用就用。
1、 map函數, 是集合和String類的執行個體方法, 作用是遍曆時修改item;map並不會修改執行個體值, 而且建立一個拷貝。
摘自官方文檔:
let cast = ["Vivien", "Marlon", "Kim", "Karl"]let lowercaseNames = cast.map { $0.lowercased() }// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]let letterCounts = cast.map { $0.count }// 'letterCounts' == [6, 6, 3, 4]
再舉2個例子說明: 1、將Int數群組轉換為String數組, 即map支援轉換數組參數類型;
2、偶數乘以10,測試遍曆時添加自訂邏輯;
let array = [1, 2, 3] let str1 = array.map({ "$\($0)"}) //數組每個元素轉成String類型 let str2 = array.map{ param -> Int in //遍曆時可以添加條件判斷邏輯 if param%2 == 0 { return param * 10 //偶數乘以10 } else { return param } } print(array) //[1 2 3] print(str1) //[“$1","$2","$3"] print(str2) //[1,20,3]
2、flatMap, 功能跟map類似; 區別是flatMap會過濾nil元素, 並解包Optional。
樣本:
arr1包含5個值, arr4包含4個值。
flatMap還可以將多維陣列轉換為一維數組;
對於N維數組, map函數仍然返回N維數組。
PS: arr數組裡包含3個元素, map迴圈了4次。
3、 filter函數, 顧名思義就是過濾出合格元素。
4、reduce函數, 它可以使用2個參數即$0和$1, 而前3個函數只能使用一個參數$0。
reduce可以實現求和, 或篩選出符合條件記錄計算總和。
高階函數還可以鏈式使用(多級):
let array = [1, 2, 3, 4, 5] let sum0 = array.filter{ $0 > 2}.reduce(0, +) print(sum0) //12
求數組裡大於2的值之和。
組合調用:
找出二維數組中所有的偶數。
let array = [[1,2,3], [4,5,6], [7,8,9] ]let even = array.flatMap { $0.filter { $0%2 == 0}}print(even) //[2,4,6,8]
如果使用基本二維數組遍曆的文法就比較麻煩了:
//基本的二維數組遍曆var evenArr = [Int]()for arr in array { for item in arr { if item % 2 == 0 { evenArr.append(item) } }}print(evenArr)