map 函数和 flatMap 函数的使用
如果对一个数组的每个元素都进行求平方, 我们之前的写法是这样的
let a = [1, 2, 3, 4, 5]
var b = [Int]()
for item in a {
b.append(item * item)
}
b // [1, 4, 9, 16, 25]
如果使用 map 映射函数只需要很简短的代码就可以实现
let c = a.map { (item) -> Int in
item * item
}
相比原来的方法, map 很简洁, 去除了无关的内容, 逻辑比原来也更清晰, 还可以直接得到结果, 不再需要用 var 来声明可变, 返回数组直接用 let 声明. 另外, 由于元素类型可以从传递给 map 的函数中推断出来, 我们也不再需要为 c 数组显示指明类型
map 闭包接受参数是原数组中每个元素, 后面的返回值是转换后的元素类型, 如果类型一致是可以省略的
let c = a.map { (item) in
item * item
}
map 就像一个信号, 一旦你看到它, 就会知道即将有一个函数作用在数组的每个元素上, 并返回另一个数组, 它将包含所有被转换后的结果
实际应用中可能会用在更负责类型的转换上, 比如转换成 Model 模型
// 数据清单
let dataList: [(title: String, value: Int, desc: String)] = [
(title: "牛奶", value: 1, desc: "蛋白质"),
(title: "鸡蛋", value: 1, desc: "营养高"),
(title: "面包", value: 1, desc: "主食"),
(title: "可乐", value: 1, desc: "垃圾食品"),
(title: "水果", value: 1, desc: "富含维生素"),
]
// Food 类
class Food {
var name: String
var serialNumber: Int
var descption: String
init(name: String, serialNumber: Int, descption: String){
self.name = name
self.serialNumber = serialNumber
self.descption = descption
}
}
通过 map 函数来转换
let dataArray = dataList.map { (element) -> Food in
Food.init(name: element.title, serialNumber: element.value, descption: element.desc)
}
element 参数代表 dataList 中的每个元素, 参数映射转换后的返回类型是 Food, map 函数再将这些转换后的元素组成一个新的数组并返回, 此时 dataArray 的类型是 [Food]
flatMap 函数的功能和 map 函数类似