Swift 中 map 的使用

881 阅读1分钟

基本使用

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 来简化代码,提高可读性。