由于之前(2年前)经常使用的是OC, 因此对 swift 中一些特性还是相当不太熟悉, 当然这不熟悉也包括 Swift 中的 Array。Swift Array 的 map 以及 flatMap 每隔一段时间就会忘记,以下对它们简单记录。
Array map 方法
@inlinable public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
从方法名来讲 map 是映射的意思,正如其名该方法是获得对数组元素一一映射之后的结果。
如以下代码所示:
1.是对数组的每个字符串进行小写之后在组合成一个新数组。
2.是对数组的每个字符串计数(获得字符串中字符的个数)之后在组合成一个新数组。
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 1 . 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 2. 'letterCounts' == [6, 6, 3, 4]
Array flatMap 方法
@inlinable public func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
从方法名来讲 flat map 是展开(铺平)映射的意思。可以看到该方法通过 transform 参数进行变换, transform 的参数类型是 (Element) throws -> SegmentOfResult) 其中 SegmentOfResult 是序列(Sequence),也就是说这个方法是对数组中的每一个元素进行变换(把当前元素变换为一个序列)。
然后方法返回的是:每个元素变换后的序列在展开然后结合组成的一个大数组。
如下方法所示
let numbers = [1, 2, 3, 4]
let mapped = numbers.map { Array(repeating: $0, count: $0) }
// [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
争议点
如下代码段返回 ["a", "2", "b", "2", "c", "2"]
let cc = array.flatMap { (str) in
str + "2"
}
但是以下代码段却返回 [2, 3, 4]
var array = [1, 2, 3]
let cc = array.flatMap { (number) in
number + 1
}
网友评论