理論
在 Swift 中,高階函數(shù)是指那些能夠接受一個或多個函數(shù)作為參數(shù),或者返回一個函數(shù)作為結(jié)果的函數(shù)。Swift 標準庫中提供了一些常見的高階函數(shù),比如 map、filter、reduce 等。它們通常用于操作集合類型(如數(shù)組、字典等),使代碼更加簡潔和表達力強。
1. map 函數(shù)
map 用于將集合中的每個元素轉(zhuǎn)換成新的元素,返回一個新的集合。
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers) // 輸出: [1, 4, 9, 16, 25]
2. filter 函數(shù)
filter 用于篩選出符合條件的元素,返回一個新的數(shù)組。
let numbers = [1, 2, 3, 4, 5, 6]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // 輸出: [2, 4, 6]
3. reduce 函數(shù)
reduce 用于將集合中的元素結(jié)合成一個單一的值。它需要一個初始值和一個閉包,閉包會依次將元素合并到一個結(jié)果中。
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 輸出: 15
4. flatMap
flatMap 用于將一個集合中的多個元素展開成一個新的集合。常用于處理數(shù)組嵌套的情況。
let arrayOfArrays = [[1, 2], [3, 4], [5, 6]]
let flattenedArray = arrayOfArrays.flatMap { $0 }
print(flattenedArray) // 輸出: [1, 2, 3, 4, 5, 6]
5. compactMap 函數(shù)
compactMap 類似于 map,但是它會自動過濾掉 nil 值,返回一個非 nil 的新數(shù)組。
let strings = ["1", "2", "three", "4"]
let numbers = strings.compactMap { Int($0) }
print(numbers) // 輸出: [1, 2, 4]
6. sort 函數(shù)
sort 是原地排序函數(shù),修改原數(shù)組。
var numbers = [5, 2, 4, 1, 3]
let sortedNumbers = numbers.sorted()
print(sortedNumbers) // 輸出: [1, 2, 3, 4, 5]
7. sorted 函數(shù)
sorted 會返回一個新的排序后的數(shù)組,不修改原數(shù)組。
var numbers = [5, 2, 4, 1, 3]
let sortedNumbers = numbers.sorted()
print(sortedNumbers) // 輸出: [1, 2, 3, 4, 5]
let names = ["Zoe", "Alice"]
let sortedNames = names.sorted { $0 < $1 } // ["Alice", "Zoe"]
// 簡寫:
let sortedNames = names.sorted(by: <)
8. forEach 函數(shù)
forEach 用于對集合中的每個元素執(zhí)行某個操作。
let numbers = [1, 2, 3, 4, 5]
numbers.forEach { print($0) }
9. 組合使用
鏈式調(diào)用提高可讀性:
let result = numbers
.filter { $0 % 2 == 0 } // 篩選偶數(shù)
.map { $0 * 3 } // 每個元素乘3
.reduce(0, +) // 求和
// 若 numbers = [1, 2, 3, 4],結(jié)果為 (2+4)*3 = 18
10. 惰性求值 (lazy)
優(yōu)化性能,避免中間數(shù)組生成:
let result = numbers.lazy
.filter { $0 % 2 == 0 }
.map { $0 * 3 }
// 實際計算延遲到訪問元素時進行
11. 自定義高階函數(shù)
接受閉包作為參數(shù)的函數(shù):
func retry(times: Int, task: () -> Bool) {
for _ in 0..<times {
if task() { return }
}
}
retry(times: 3) {
print("執(zhí)行任務...")
return arc4random_uniform(3) == 0 // 模擬隨機成功
}
注意事項:
1.性能:鏈式調(diào)用可能生成中間數(shù)組,對大數(shù)據(jù)集考慮使用 lazy。
2.閉包捕獲:注意循環(huán)引用,使用 [weak self] 或 [unowned]。
3.類型匹配:如 reduce 的初始值需與結(jié)果類型一致。