Swift 提供了许多高阶函数(Higher-Order Functions),这些函数可以作为参数接收其他函数或返回函数。高阶函数在数组、集合、字典等序列类型中非常常见,主要用于对集合进行过滤、映射、转换和操作。
常见的高阶函数
1、map
将集合中的每个元素应用一个闭包,返回变换后的新集合。
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8, 10]
2、compactMap
类似 map,但会移除 nil 值。
let strings = ["1", "2", "three", "4"]
let integers = strings.compactMap { Int($0) }
print(integers) // [1, 2, 4]
3、flatMap
将嵌套集合“展平”,或移除嵌套中的 nil。
let nestedArray = [[1, 2], [3, 4], [5]]
let flattenedArray = nestedArray.flatMap { $0 }
print(flattenedArray) // [1, 2, 3, 4, 5]
4、filter
筛选集合中的元素,保留满足条件的元素。
let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4]
5、reduce
通过闭包将集合中的元素合并成单一值。
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 15
初始值 0 是累加器的起始值。
6、forEach
类似于 for-in 循环,用于遍历集合的每个元素。
let names = ["Alice", "Bob", "Charlie"]
names.forEach { print($0) }
// 输出:Alice, Bob, Charlie
7、sorted / sorted(by:)
对集合进行排序,默认为升序。
let numbers = [5, 3, 2, 1, 4]
let sortedNumbers = numbers.sorted()
print(sortedNumbers) // [1, 2, 3, 4, 5]
let descending = numbers.sorted(by: >)
print(descending) // [5, 4, 3, 2, 1]
8、contains
判断集合中是否包含满足条件的元素。
let names = ["Alice", "Bob", "Charlie"]
let hasAlice = names.contains { $0 == "Alice" }
print(hasAlice) // true
9、allSatisfy
判断集合中的所有元素是否满足指定条件。
let numbers = [2, 4, 6, 8]
let allEven = numbers.allSatisfy { $0 % 2 == 0 }
print(allEven) // true
10、first(where:)
返回集合中第一个满足条件的元素。
let numbers = [1, 3, 5, 6, 7]
if let firstEven = numbers.first(where: { $0 % 2 == 0 }) {
print(firstEven) // 6
}
11、dropFirst / dropLast
丢弃集合中的前几个或后几个元素,返回剩余部分。
let numbers = [1, 2, 3, 4, 5]
let dropped = numbers.dropFirst(2)
print(dropped) // [3, 4, 5]
12、prefix / suffix
获取集合的前几个或后几个元素。
let numbers = [1, 2, 3, 4, 5]
let firstThree = numbers.prefix(3)
print(firstThree) // [1, 2, 3]
prefix获取前面的几个元素,suffix获取后面的几个元素。
适用于字典的高阶函数
1、compactMapValues
对字典的值进行转换,移除 nil。
let dict = ["a": "1", "b": "2", "c": "three"]
let validDict = dict.compactMapValues { Int($0) }
print(validDict) // ["a": 1, "b": 2]
其他有用的高阶函数
1、zip
将两个集合合并为一个元组集合。
let names = ["Alice", "Bob", "Charlie"]
let scores = [90, 85, 88]
let zipped = zip(names, scores)
print(Array(zipped)) // [("Alice", 90), ("Bob", 85), ("Charlie", 88)]
总结
Swift 的高阶函数提供了强大的功能,以声明式风格对集合、字典和其他数据结构进行操作。熟悉这些高阶函数,可以显著提高代码的可读性和简洁性。