在 Swift 中,高阶函数(Higher-Order Functions) 是指能够接受闭包作为参数或返回闭包作为结果的函数。它们常用于集合类型(如 Array、Set、Dictionary)的操作,能简化代码并提高可读性。以下是 Swift 中常用的高阶函数及其详细说明:
1. map
作用:对集合中的每个元素进行转换,返回一个包含转换结果的新集合。
语法:
func map<T>(_ transform: (Element) -> T) -> [T]
参数:
transform:一个闭包,接受集合元素并返回转换后的值。
示例:
let numbers = [1, 2, 3]
let squared = numbers.map { $0 * $0 } // [1, 4, 9]
2. filter
作用:筛选出满足条件的元素,返回一个新集合。
语法:
func filter(_ isIncluded: (Element) -> Bool) -> [Element]
参数:
isIncluded:返回Bool的闭包,决定元素是否被保留。
示例:
let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 } // [2, 4]
3. reduce
作用:将集合元素合并为一个值(如求和、拼接字符串等)。
语法:
func reduce<Result>(
_ initialResult: Result,
_ nextPartialResult: (Result, Element) -> Result
) -> Result
参数:
initialResult:初始值。nextPartialResult:合并当前结果和元素的闭包。
示例:
let numbers = [1, 2, 3]
let sum = numbers.reduce(0) { $0 + $1 } // 6
// 简写形式:numbers.reduce(0, +)
4. compactMap
作用:对元素进行转换,并自动过滤掉结果为 nil 的项。
语法:
func compactMap<T>(_ transform: (Element) -> T?) -> [T]
示例:
let strings = ["1", "2", "apple"]
let numbers = strings.compactMap { Int($0) } // [1, 2]
5. flatMap
作用:
- Swift 4 之前:将嵌套集合“扁平化”为一维数组,同时支持可选值转换。
- Swift 4+ :仅用于扁平化嵌套集合(可选值处理由
compactMap代替)。
语法:
func flatMap<T>(_ transform: (Element) -> [T]) -> [T]
示例:
let nestedArray = [[1, 2], [3, 4]]
let flattened = nestedArray.flatMap { $0 } // [1, 2, 3, 4]
6. forEach
作用:遍历集合元素,类似 for-in 循环,但无返回值。
语法:
func forEach(_ body: (Element) -> Void)
示例:
["a", "b", "c"].forEach { print($0) }
7. sorted
作用:根据闭包的排序条件返回一个新的有序数组。
语法:
func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
示例:
let numbers = [3, 1, 2]
let sortedDesc = numbers.sorted(by: >) // [3, 2, 1]
8. contains
作用:判断集合是否包含满足条件的元素。
语法:
func contains(where predicate: (Element) -> Bool) -> Bool
示例:
let numbers = [1, 2, 3]
let hasEven = numbers.contains { $0 % 2 == 0 } // true
9. prefix / suffix
作用:
prefix:返回满足条件的前几个元素,直到条件不满足为止。suffix:返回从末尾开始的满足条件的元素(需先反转集合)。
语法:
func prefix(while predicate: (Element) -> Bool) -> [Element]
func suffix(_ maxLength: Int) -> [Element] // 非高阶函数版本
示例:
let numbers = [1, 2, 3, 4, 5]
let prefix = numbers.prefix { $0 < 4 } // [1, 2, 3]
10. first(where:) / last(where:)
作用:查找第一个/最后一个满足条件的元素。
语法:
func first(where predicate: (Element) -> Bool) -> Element?
func last(where predicate: (Element) -> Bool) -> Element?
示例:
let numbers = [1, 2, 3, 4, 5]
let firstEven = numbers.first { $0 % 2 == 0 } // 2
11. removeAll(where:)
作用:原地移除所有满足条件的元素(Swift 5.2+)。
语法:
mutating func removeAll(where shouldBeRemoved: (Element) -> Bool)
示例:
var numbers = [1, 2, 3, 4, 5]
numbers.removeAll { $0 % 2 == 0 } // numbers 变为 [1, 3, 5]
高阶函数组合示例
let numbers = [1, 2, 3, 4, 5]
let result = numbers
.filter { $0 % 2 == 0 } // [2, 4]
.map { $0 * 10 } // [20, 40]
.reduce(0, +) // 60
总结
| 函数 | 作用 | 返回值类型 |
|---|---|---|
map | 元素转换 | 新数组 |
filter | 筛选元素 | 新数组 |
reduce | 合并元素 | 任意类型 |
compactMap | 转换并过滤 nil | 新数组(非可选) |
flatMap | 扁平化嵌套集合 | 一维数组 |
forEach | 遍历元素 | 无 |
sorted | 排序 | 新数组 |
contains | 判断条件是否满足 | Bool |
通过灵活组合这些高阶函数,可以极大简化集合操作代码,提升开发效率