Swift 中数组的高阶函数filter、enumerate、m
2025-11-13 本文已影响0人
大成小栈
在Swift中,filter、enumerate、map、flatMap都是数组的高阶函数,用于函数式编程。让我详细解释它们的区别:
1. filter - 过滤
用于根据条件筛选数组中的元素:
let numbers = [1, 2, 3, 4, 5, 6]
// 筛选偶数
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4, 6]
// 筛选大于3的数字
let greaterThanThree = numbers.filter { $0 > 3 }
print(greaterThanThree) // [4, 5, 6]
特点:返回一个新数组,包含所有满足条件的元素
2. enumerate - 枚举(现在使用enumerated())
用于同时获取元素和索引:
let fruits = ["apple", "banana", "orange"]
// 旧方法(Swift 3之前)
for (index, fruit) in fruits.enumerated() {
print("Index \(index): \(fruit)")
}
// 输出:
// Index 0: apple
// Index 1: banana
// Index 2: orange
// 与map结合使用
let indexedFruits = fruits.enumerated().map { (index, fruit) in
return "\(index): \(fruit)"
}
print(indexedFruits) // ["0: apple", "1: banana", "2: orange"]
3. map - 映射
将数组中的每个元素转换为另一种形式:
let numbers = [1, 2, 3, 4]
// 将每个数字乘以2
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8]
// 转换为字符串
let strings = numbers.map { "Number \($0)" }
print(strings) // ["Number 1", "Number 2", "Number 3", "Number 4"]
// 可选值处理
let optionalNumbers: [Int?] = [1, nil, 3, nil, 5]
let nonNilStrings = optionalNumbers.map { $0 == nil ? "nil" : "\($0!)" }
print(nonNilStrings) // ["1", "nil", "3", "nil", "5"]
4. flatMap - 扁平化映射(现在分拆为compactMap和flatMap)
compactMap - 过滤nil并转换
let optionalNumbers: [Int?] = [1, nil, 3, nil, 5]
// 过滤nil值并转换
let validNumbers = optionalNumbers.compactMap { $0 }
print(validNumbers) // [1, 3, 5]
// 转换并过滤nil
let strings = optionalNumbers.compactMap { $0 == nil ? nil : "\($0!)" }
print(strings) // ["1", "3", "5"]
flatMap - 扁平化嵌套数组
let nestedArray = [[1, 2, 3], [4, 5], [6]]
// 将二维数组展平为一维数组
let flattened = nestedArray.flatMap { $0 }
print(flattened) // [1, 2, 3, 4, 5, 6]
// 先map再flatMap
let complexArray = [[1, 2], [3, 4]]
let result = complexArray.flatMap { $0.map { $0 * 2 } }
print(result) // [2, 4, 6, 8]
综合比较
| 方法 | 作用 | 返回值 | 使用场景 |
|---|---|---|---|
filter |
过滤元素 | 同类型数组 | 数据筛选 |
enumerated() |
获取索引和元素 | 元组序列 | 需要索引的操作 |
map |
元素转换 | 新类型数组 | 数据转换 |
compactMap |
转换并过滤nil | 非可选类型数组 | 处理可选值 |
flatMap |
展平嵌套数组 | 扁平化数组 | 处理多维数组 |
链式调用示例
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let result = numbers
.filter { $0 % 2 == 0 } // 筛选偶数: [2, 4, 6, 8, 10]
.map { $0 * 3 } // 每个乘以3: [6, 12, 18, 24, 30]
.enumerated() // 添加索引
.map { (index, value) in // 格式化输出
"\(index + 1). \(value)"
}
print(result) // ["1. 6", "2. 12", "3. 18", "4. 24", "5. 30"]
这些高阶函数让Swift代码更加简洁、易读,是函数式编程在Swift中的重要体现。