Swift 中的高阶函数有哪些?如何使用 map、filter、reduce 等函数式编程特性?
Swift 提供了丰富的高阶函数,支持函数式编程范式。这些函数可以接受其他函数作为参数或返回函数,使代码更加简洁和声明式。
主要的高阶函数:
-
map:
- 对集合中的每个元素应用转换函数
- 返回包含转换后元素的新数组
- 保持原始集合不变
- 示例:
swift
let numbers = [1, 2, 3, 4, 5] let doubled = numbers.map { $0 * 2 } // [2, 4, 6, 8, 10] let names = ["alice", "bob", "charlie"] let capitalized = names.map { $0.capitalized } // ["Alice", "Bob", "Charlie"]
-
filter:
- 根据条件筛选集合中的元素
- 返回包含满足条件元素的新数组
- 示例:
swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let evenNumbers = numbers.filter { $0 % 2 == 0 } // [2, 4, 6, 8, 10] let words = ["apple", "banana", "pear", "grape"] let longWords = words.filter { $0.count > 4 } // ["apple", "banana"]
-
reduce:
- 将集合中的元素组合成单个值
- 接受初始值和组合函数
- 示例:
swift
let numbers = [1, 2, 3, 4, 5] let sum = numbers.reduce(0) { $0 + $1 } // 15 let product = numbers.reduce(1) { $0 * $1 } // 120 let names = ["Alice", "Bob", "Charlie"] let allNames = names.reduce("") { $0 + $1 + " " } // "Alice Bob Charlie "
-
flatMap:
- 对集合中的每个元素应用转换函数,并展平结果
- 处理嵌套数组或可选值
- 示例:
swift
let numbers = [[1, 2], [3, 4], [5, 6]] let flattened = numbers.flatMap { $0 } // [1, 2, 3, 4, 5, 6] let optionalNumbers: [Int?] = [1, nil, 3, nil, 5] let nonNilNumbers = optionalNumbers.flatMap { $0 } // [1, 3, 5]
-
compactMap:
- 类似于 map,但过滤掉 nil 值
- 专门用于处理可选值
- 示例:
swift
let strings = ["1", "2", "three", "4", "five"] let numbers = strings.compactMap { Int($0) } // [1, 2, 4]
-
forEach:
- 对集合中的每个元素执行操作
- 不返回新值
- 示例:
swift
let numbers = [1, 2, 3, 4, 5] numbers.forEach { print($0) }
-
sorted:
- 对集合进行排序
- 可以自定义排序规则
- 示例:
swift
let numbers = [5, 2, 8, 1, 9] let ascending = numbers.sorted { $0 < $1 } // [1, 2, 5, 8, 9] let descending = numbers.sorted { $0 > $1 } // [9, 8, 5, 2, 1]
链式调用:
swiftlet numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let result = numbers .filter { $0 % 2 == 0 } .map { $0 * $0 } .reduce(0) { $0 + $1 } // 220 (2² + 4² + 6² + 8² + 10²)
最佳实践:
- 优先使用高阶函数而非 for 循环
- 合理使用链式调用提高代码可读性
- 注意性能影响,避免过度嵌套
- 使用有意义的变量名提高代码清晰度
- 在复杂逻辑中使用传统循环提高可维护性