flatMap跟map都是讲一个数组转变成另一个你需要的数组
let array = ["","22","333"]
map函数能够被数组调用,它接受一个闭包作为参数,作用于数组中的每个元素,闭包返回一个变换后的元素,接着将所有这些变换后的元素组成一个新的数组。
let anotherArr = array.map { (string:String) -> Int? in
let length = string.characters.count
guard length > 0 else{
return nil
}
return string.characters.count
}
print(anotherArr)
//输出
[nil, Optional(2), Optional(3)]
flatMap
flatMap很像map函数,但是它摒弃了那些值为nil的元素。
另外一个与map函数不同之处在于:倘若元素值不为nil情况下,flapMap能够将可选类型(optional)转换为非可选类型(non-optionals)
let Arr3 = array.flatMap { (string:String) -> Int? in
let length = string.characters.count
guard length > 0 else{
return nil
}
return string.characters.count
}
print(Arr3)
//输出
[2, 3]
map 跟 flatMap的区别
map 函數定義大致為 func map<T>(f: T -> V) -> Box<V>,它會嘗試取出 Box 中的值,如果成功則進行操作,如果不成功則維持原樣再傳遞下去。
flatMap 函數定義大致為 func flatMap<T>(f: T -> Box<V>) -> Box<V>,他可以避免比如 map 中傳入的是一個 Optional<T> 後返回了一個 Optional<Optional<T>> 的糾結情況,簡單來說就是攤平結果,使之更好處理。Array 的 flatMap 還有另外一種用法:如果 Array 中的 Element 也是一個 Array<V>,則可以將其攤平為 Array<V>。