基本使用
map 的作用是对数组的每一个元素进行映射,最后返回一个映射后的数组。比如可以通过 map 将 Int 类型的数组转为 String 类型:
let intArr = [1, 2, 3, 4, 5]
let strArr = intArr.map { String($0) }
print(strArr) // ["1", "2", "3", "4", "5"]
需要注意的是,在 let strArr = intArr.map { String($0) } 这行代码执行完,数组中所有的元素的已经映射完了,即使后面你只使用到了 strArr 的某几个元素。
如果 map 里的代码很消耗性能,或者数组元素特别多的话,就会对性能造成一定的影响,为了解决这个问题,可以使用 lazy。
lazy
lazy 的使用很简单,如下:
let lazyStrArr = intArr.lazy.map { String($0) }
这样,就会在你具体访问到某个元素的时候才会进行对应的映射,从而提高性能。
Optional
一般情况下,我们都是使用集合类型来使用 map,其实对于 Optional, 我们也可以使用 map 来进行代码的简化,提高代码可读性。
假设下面一种场景,我们从服务器获取一个字符串,不确定它有没有值,如果有值的话就拼接上一个字符串,下面是我们一般的写法:
var name: String? = "jack"
var result1 = ""
if name != nil {
result1 = name! + "_man"
}
这种写法有两个问题,第一个就是如果 result 我们后续不需要修改,我们也无法将其声明为 let;第二个就是代码多。
我们可以通过使用 map 来避免上面的两个问题:
let result2 = name.map { $0 + "_man" }
下面再看一个关于日期格式转换的例子:
var dateStr: String? = "2011-09-10"
var fmt = DateFormatter()
fmt.dateFormat = "yyyy-mm-dd"
if let str = dateStr {
let date = fmt.date(from: str)
}
上述代码可以通过 map 来简化:
let date = dateStr.map { fmt.date(from: $0) }
虽然做了简化,但上面的代码还是有点小瑕疵,就是 date 是 Optional(Optional) 类型,这样我们解包就比较麻烦,这个可以使用 flatMap 来避免:
let date = dateStr.flatMap { fmt.date(from: $0) }
总结
- map 可以通过使用 lazy 来提高性能。
- optional 可以通过 map 和 flatMap 来简化代码,提高可读性。