简述
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]
看到这两个数组的输出就看出差别来了,对于二维数组,map
和flatMap
的结果就不同了。
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]
。 这也是flatMap
和 map
的一个重大区别。