摘要
有一次问同事,他面试时一般会问别人什么,然后他随便说了一些题目,有一些听了后一时间想不出来答案,自己感觉也挺有意思,于是记录一下,其中一个题目是:不允许使用for 、while 、do while等常用的循环方法,如何实现对数组中每个元素执行同一个操作。开始就想到OC中数组有一个方法makeobjectperformselector,而Swift中,map函数即可实现。
1. map函数
简单用map回答一下摘要中的方法,如果我们项目中,要对所有银行卡对象中的银行卡名称添加信用卡三个字,实现如下
var arrDebit : Array<XYJBank> = Array<XYJBank>()
if let bankArr : Array<XYJBank> = Mapper<XYJBank>().mapArray(JSONArray: bankList){ // 这个方法是字典转模型数组方法(bankList是一个银行卡信息字典数组)
arrCredit = bankArr.map({ (bank: XYJBank) -> XYJBank in // 对数组中每个对象的银行卡名称添加信用卡字样
bank.cardType = cardType
if(bank.cardType == "CREDITCARD") {
bank.name = bank.name! + "信用卡"
}
return bank
})
}
1.1 map 函数定义与简单使用
它可以对一个集合类型的所有元素做一个映射操作
func map(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]
抛开一些和关键逻辑无关的修饰符 简化:
func map(transform: (Self.Generator.Element) -> T) rethrows -> [T]
它接受一个(Self.Generator.Element) -> T 类型的闭包,而闭包中 Self.Generator.Element 类型的参数, 这个类型代表数组中当前元素的类型。 而这个闭包的返回值,是可以和传递进来的值不同的。
map函数的返回值是一个数组,数组里的元素类型为上面参数闭包所返回的类型,可与传入数组时原始类型不一致。
简单例子:
1、一维数组
let numbers = [1,2,3,4]
let result = numbers.map { $0 + 2 } // $0表示闭包中的第一个参数,这里只有一个参数,即当前遍历到的元数。
print(result) // [3,4,5,6]
2、二维数组
let numbers2 = [[1,2,3],[4,5,6]];
var result = numbers2.map { $0.map{ $0 + 2 } }
print(result)// [[3, 4, 5], [6, 7, 8]]
//这个调用实际上是遍历了这里两个数组元素 [1,2,3] 和 [4,5,6]。 因为这两个元素依然是数组,所以我们可以对他们再次调用 map 函数。