点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
在 Swift 开发中,经常用到这三个高阶函数,map、compactMap 和 flatMap,它们都是用于处理集合(数组或者字典)的方法,但它们有着不同的功能和用途。今天让我们来逐个介绍它们的区别。
map
功能:对集合中的每个元素进行转换,并返回一个新的包含转换结果的集合。
示例:假设有一个包含整数的数组,我们想将每个元素都乘以 2,然后得到一个新的包含结果的数组。
代码例子:
let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = numbers.map { $0 * 2 }
print(doubledNumbers)
// 输出: [2, 4, 6, 8, 10]
从这个例子中可以看出,map 函数是对数组中每个元素做了指定的改变(乘以 2)。
再举个例子,假设我们有一个包含学生姓名的数组,我们想将每个学生的姓名首字母提取出来并转换为大写字母,得到一个新的数组。这时可以使用 map 方法来完成这个操作。
let students = ["Alice", "Bob", "Charlie", "David"]
let initials = students.map { $0.prefix(1).uppercased() }
print(initials)
// 输出: ["A", "B", "C", "D"]
compactMap
功能:对集合中的每个元素进行转换,并返回一个新的包含转换结果的集合,这和 map 函数一样。与 map 不同的是,compactMap 会自动过滤掉转换结果为 nil 的元素。
示例:假设有一个包含字符串的数组,我们想将每个字符串转换成整数,然后得到一个新的包含转换结果的数组,自动过滤掉不是数字的字符串。
代码例子:
let strings = ["1", "2", "3", "abc", "5"]
let numbers = strings.compactMap { Int($0) }
print(numbers)
// 输出: [1, 2, 3, 5]
因为 "abc" 不是数字,所以通过 Int($0) 转换为数字时会返回 nil,compactMap 会自动过滤掉返回 nil 的元素,因此最终输出结果为 [1, 2, 3, 5]。
flatMap
功能:对集合中的每个元素进行转换,并返回一个新的包含转换结果的扁平化集合,扁平化集合的意思是如果数组有嵌套,它会把嵌套的数组元素拿出来统一合并成一个单一的集合。
示例:假设有一个包含数组的数组,我们想将其中的每个数组合并成一个一维的数组。
代码例子:
let arrays = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
let flattenedArray = arrays.flatMap { $0 }
print(flattenedArray)
// 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
这个例子中,外层的数组内嵌套了三个子数组,flatMap 会把子数组拿出来铺平。
再举一个现实中的例子,假设我们有一批订单,每个订单中有一系列商品,现在我想把所有订单里的商品合并成一个数组,得到一个扁平化的结果。这时可以使用 flatMap 方法来完成这个操作。
// 订单对象
struct Order {
// 产品列表
let products: [String]
}
// 所有订单
let orders = [
Order(products: ["Apple", "Banana", "Orange"]),
Order(products: ["Milk", "Eggs"]),
Order(products: ["Bread", "Butter", "Jam"])
]
let allProducts = orders.flatMap { $0.products }
print(allProducts)
// 输出: ["Apple", "Banana", "Orange", "Milk", "Eggs", "Bread", "Butter", "Jam"]
通过今天的讲解,希望你能正确理解 map、compactMap 和 flatMap 的不同用途和功能,在实际需求中选择合适的方法,以提高代码的可读性和性能。
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!