map
使用實例
/// let cast = ["Vivien", "Marlon", "Kim", "Karl"]
/// let lowercaseNames = cast.map { $0.lowercased() }
/// // 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
/// let letterCounts = cast.map { $0.count }
/// // 'letterCounts' == [6, 6, 3, 4]
原理分析
@inlinable public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
去掉各種修飾,函數輸入下:
public func map<T>(_ transform: (Element) -> T) rethrows -> [T]
tranform 是一個映射閉包, 接受一個 序列的元素參數,返回一個 相同或者不用類型的元素。 map 的返回值是一個轉換後的元素類型的數組。
flatMap(deprecated: 4.1, 使用 compactMap替換)
使用實例
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.flatMap { $0.lowercased() }
print(lowercaseNames)// ["v", "i", "v", "i", "e", "n", "m", "a", "r", "l", "o", "n", "k", "i", "m", "k", "a", "r", "l"]
數組的元素是一個序列, flatMap進行了降維
let cast = [2, 3, 4, 5]
let lowercaseNames = cast.flatMap { $0 + 2}
print(lowercaseNames)//[4, 5, 6, 7]
數組的元素是數字,這裏和使用map 的效果是一樣的
源碼解析
public func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element]
/// In fact, `s.flatMap(transform)` is equivalent to
/// `Array(s.map(transform).joined())`.
tranform 是一個閉包, 閉包對元素進行轉換。
map 函數值對元素進行變換操作。 但不會對數組的結構造成影響。 而 flatMap 會影響數組的結構
compactMap
public func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
用法和flatmap一致