第七篇:swift中map和flatMap的使用

简述

map和flatMap是swift中两个常用的函数,它们提现了swift中很多特性。

map

1、map的使用

let numbers = [1,2,3,4]
let result = numbers.map { $0 + 2 }
print(result)    //输出:3,4,5,6

大家可以看一下,map方法接受的是一个闭包参数,然后它会遍历整个numbers数组,并对数组中每一个元素执行闭包中定义的操作。相当于对数组中的所有元素做了一个映射。
这个例子就是对numbers数组的所有元素进行了加2。

再看一个例子:

let array1 = ["a","b","c","d"]
let array2 = array1.map { "NO.\($0)" }
print(array2)    //输出:NO.a,NO.b,NO.c,NO.d

2、flatMap的使用
map 可以理解为对一个集合类型的所有元素做了一个映射操作,那么flatMap呢?

让我们来看一下下面的一个例子:

result = numbers.flatMap{ $0 + 2 }      //输出:3,4,5,6

我们对同样的数组使用了flatMap进行处理,得到了相同的结果。那么这两个到底有什么区别呢?

let array1 = [[1,2,3],[4,5,6]]
var arr = array1.map{ $0.map{ $0 + 1 } }
//输出:[[2,3,4],[5,6,7]]

var arr2 = array1.flatMap{ $0.map{ $0 + 1 } }
//输出:[2,3,4,5,6,7]

看到这两个数组的输出就看出差别来了,对于二维数组,mapflatMap的结果就不同了。

flatMap 会遍历数组的元素,并对这些元素执行闭包中定义的操作。 但唯一和map不同的是,它对最终的结果进行了所谓的 “降维” 操作。 本来原始数组是一个二维的, 但经过 flatMap 之后,它变成一维的了。

大家再来看看flatMap的第二个作用:

let optionalArray: [String?] = ["AA","BB",nil,"CC"]
print(optionalArray)   
//输出:[Optional("AA"), Optional("BB"), nil, Optional("CC")]

var flatMapArray = optionalArray.flatMap{ $0 }
print(flatMapArray)
//输出:["AA", "BB", "CC"]

大家可以看到,在flatMap 的返回结果中, 成功的将原数组中的 nil 值过滤掉了。 再仔细观察,你会发现更多。 使用 flatMap 调用之后, 数组中的所有元素都被解包了。也就是说原始数组的类型是 [String?], 而 flatMap 调用后变成了 [String]。 这也是flatMapmap 的一个重大区别。

你可能感兴趣的:(第七篇:swift中map和flatMap的使用)