map, flatMap分析

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一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章