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 函数类似

results matching ""

    No results matching ""