美文网首页
Swift 中数组的高阶函数filter、enumerate、m

Swift 中数组的高阶函数filter、enumerate、m

作者: 大成小栈 | 来源:发表于2025-11-13 16:08 被阅读0次

在Swift中,filterenumeratemapflatMap都是数组的高阶函数,用于函数式编程。让我详细解释它们的区别:

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中的重要体现。

相关文章

网友评论

      本文标题:Swift 中数组的高阶函数filter、enumerate、m

      本文链接:https://www.haomeiwen.com/subject/efkmfstx.html