前言
在Swift中恢总,有關(guān)于Array的高階函數(shù)。這一點和JavaScript是一樣的杠愧。也就是說利朵,Swift也是支持函數(shù)式編程的律想。
關(guān)于Array有以下幾個高階函數(shù):filter
map
reduce
flatMap
compactMap
。其中前三個和JavaScript語言是一樣的绍弟,不同的是語法不同而已技即。下面我們就來探索一下這5個高階函數(shù)。掌握了這些高階函數(shù)樟遣,可以讓我們對于一些關(guān)于數(shù)組處理更加得心應(yīng)手而叼。
實踐
-
filter函數(shù):過濾郭脂,將數(shù)組中的元素按照一定的條件進(jìn)行過濾 返回過濾后新數(shù)組
- 傳入函數(shù)/閉包表達(dá)式
- 該函數(shù)/閉包表達(dá)式會執(zhí)行n次,n代表數(shù)組中元素個數(shù)
- 該函數(shù)/閉包表達(dá)式 必須返回Bool類型
- 該函數(shù)/閉包表達(dá)式 接收一個參數(shù)澈歉,該參數(shù)就是每次遍歷的數(shù)組中元素
- 如果函數(shù)/閉包表達(dá)式返回值是true 就把該元素放入新的數(shù)組
- 如果函數(shù)/閉包表達(dá)式返回值是false 該元素就會被過濾掉
let array = [1, 2, 3, 4]
let newArray = array.filter { (n) -> Bool in
return n % 2 == 0
}
print(newArray) // [2, 4]
// 利用Swift語言的語法糖 上面的代碼還可以進(jìn)行進(jìn)一步的簡化
let newArray = array.filter { $0 % 2 == 0 }
print(newArray) // [2, 4]
-
map函數(shù):將數(shù)組中元素進(jìn)行映射處理,返回處理過后的新數(shù)組
- 傳入函數(shù)/閉包表達(dá)式
- 該函數(shù)/閉包表達(dá)式會執(zhí)行n次屿衅,n代表數(shù)組中元素個數(shù)
- 該函數(shù)/閉包表達(dá)式接收一個參數(shù)埃难,該參數(shù)就是每次遍歷的數(shù)組元素
- 該函數(shù)/閉包表達(dá)式返回處理后的內(nèi)容,將處理后的內(nèi)容添加到新的數(shù)組中(映射操作)
let array = [1, 2, 3, 4]
let newArray = array.map { n in
return n * 2
}
print(newArray) // [2, 4, 6, 8]
// 簡寫
let newArray = array.map { $0 * 2 }
print(newArray) // [2, 4, 6, 8]
-
reduce函數(shù):應(yīng)用場景:匯總或者數(shù)組中每個元素的值和前一個值有關(guān)聯(lián)的處理
- 傳入初始值和一個函數(shù)/閉包表達(dá)式
- 該函數(shù)/閉包表達(dá)式會執(zhí)行n次涤久,n代表數(shù)組中元素個數(shù)
- 該函數(shù)/閉包表達(dá)式接收2個參數(shù)涡尘,上一次遍歷匯總的結(jié)果,和數(shù)組中的元素
- 將匯總的結(jié)果作為返回值返回
let array = [1, 2, 3, 4]
let result = array.reduce(0) { (previousResult, n) in
return previousResult + n
}
print(result) // 10
// 簡寫
let result = array.reduce(0) { $0 + $1 }
print(result) // 10
-
flatMap:和
map
對比著來理解- flatMap傳入的函數(shù)/閉包表達(dá)式 必須返回sequence類型
- 最終的返回值將sequence中的元素放入到新的數(shù)組中
- 而map傳入的函數(shù)/閉包表達(dá)式 直接將數(shù)組作為元素放入到新的數(shù)組中
let array = [1, 2, 3, 4]
let newArray = array.map { n in
return Array(repeating: n, count: n)
}
print(newArray) // [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
let newArray2 = array.flatMap { n in
return Array(repeating: n, count: n)
}
print(newArray2) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
// 簡寫
let newArray = array.flatMap { Array(repeating: $0, count: $0) }
print(newArray) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
-
compactMap:和
map
對比著理解- compactMap在進(jìn)行元素映射的時候响迂,會將nil過濾掉考抄,并且會將可選項進(jìn)行解包
let array = ["1", "flutter", "3", "Vue"]
let newArray = array.map { item in
return Int(item)
}
print(newArray) // [Optional(1), nil, Optional(3), nil]
let newArray2 = array.compactMap { item in
return Int(item)
}
print(newArray2) // [1, 3]
// 簡寫
let newArray = array.compactMap { Int($0) }
print(newArray) // [1, 3]