返回

Swift 高阶函数:滤除、映射、规约、扁平映射、紧凑映射

IOS

Swift 高阶函数:操作集合类型、抽象复杂操作的强大工具

简介

在 Swift 的世界里,高阶函数扮演着至关重要的角色,它们赋予开发者强大的工具来操作集合类型,抽象复杂操作,并编写出简洁易懂的代码。本文将深入探讨 Swift 中的五大高阶函数:filtermapreduceflatMapcompactMap,从基础概念到实际应用,逐一揭开它们的奥秘。

1. 滤除(filter):精准筛选,留下精华

想象一下你是一个需要从一袋苹果中挑选出所有红苹果的人。filter 函数就像一个敏锐的果农,它从集合中筛选出符合特定条件的元素,将它们纳入新的集合中。它接收一个布尔闭包作为参数,该闭包对集合中的每个元素进行判断,返回 true 则保留该元素,否则予以舍弃。

例如,以下代码片段使用 filter 从数组中滤出所有大于 10 的数字:

let numbers = [1, 5, 12, 15, 20, 25]
let filteredNumbers = numbers.filter { $0 > 10 }
// filteredNumbers 为 [12, 15, 20, 25]

2. 映射(map):巧妙转换,焕然一新

现在,你有一袋红苹果,你想把它们都变成苹果派。map 函数就是你的烹饪大师,它将集合中的每个元素应用到一个闭包中,返回一个包含转换后结果的新集合。闭包可以对元素进行任何形式的变换,从简单的数学运算到复杂的类型转换。

例如,以下代码片段使用 map 将数组中的每个数字加 1:

let numbers = [1, 5, 12, 15, 20, 25]
let incrementedNumbers = numbers.map { $0 + 1 }
// incrementedNumbers 为 [2, 6, 13, 16, 21, 26]

3. 规约(reduce):逐个合并,聚沙成塔

假设你现在有一堆苹果派,你想知道总共能吃多少。reduce 函数就像一个勤劳的厨师,它将集合中的所有元素逐个合并成一个单一的值。该函数接收两个参数:一个初始值和一个闭包,闭包用于合并两个元素。

例如,以下代码片段使用 reduce 将数组中的所有数字相加:

let numbers = [1, 5, 12, 15, 20, 25]
let sum = numbers.reduce(0) { (result, number) -> Int in
    return result + number
}
// sum 为 78

4. 扁平映射(flatMap):层层递进,抽丝剥茧

想象你有一篮子装着苹果的篮子,而这些篮子又装有更多的苹果。flatMap 函数就像一个果篮整理员,它将集合中的每个元素应用到一个闭包中,并返回一个包含所有结果的新集合。与 map 不同,flatMap 可以处理返回可选值或数组的闭包,并巧妙地将嵌套的层次结构“摊平”为一个单一的集合。

例如,以下代码片段使用 flatMap 从二维数组中提取所有奇数:

let numbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let oddNumbers = numbers.flatMap { $0.filter { $0 % 2 != 0 } }
// oddNumbers 为 [1, 3, 5, 7, 9]

5. 紧凑映射(compactMap):剔除空值,精华尽现

最后,你有一个苹果派工厂,但有些苹果派出了问题。compactMap 函数就像一个质量控制人员,它类似于 map,但它专门处理返回可选值的闭包。该函数过滤掉任何 nil 值,只保留有效的转换结果。

例如,以下代码片段使用 compactMap 从数组中提取非空字符串:

let strings = ["a", "b", "c", nil, "d", nil, "e"]
let nonNilStrings = strings.compactMap { $0 }
// nonNilStrings 为 ["a", "b", "c", "d", "e"]

结论

Swift 中的高阶函数赋予开发者强大的工具来操作集合类型,简化复杂操作,并编写出简洁易懂的代码。通过掌握 filtermapreduceflatMapcompactMap 这五大高阶函数,开发者可以提高代码的可读性、可维护性和效率,在 Swift 编程的世界中如鱼得水,游刃有余。

常见问题解答

  • filtermap 有什么区别?

filter 从集合中筛选出符合条件的元素,而 map 将集合中的每个元素应用到一个闭包中,返回一个包含转换后结果的新集合。

  • reduce 如何工作?

reduce 将集合中的所有元素逐个合并成一个单一的值。它接收一个初始值和一个闭包,闭包用于合并两个元素。

  • flatMapmap 的区别是什么?

flatMap 处理返回可选值或数组的闭包,并将嵌套的层次结构“摊平”为一个单一的集合。map 只能处理返回单个值的闭包。

  • 什么时候应该使用 compactMap

compactMap 用于从集合中过滤掉任何 nil 值,只保留有效的转换结果。

  • 高阶函数有哪些好处?

高阶函数可提高代码的可读性、可维护性和效率,并允许开发者抽象复杂操作。