使用 flatMap() 展平陣列變換的結果

除了能夠通過從序列的轉換元素中過濾掉 nil 來建立陣列之外 ,還有一個版本的 flatMap(_:) ,它期望轉換閉包返回序列 S

extension SequenceType {
    public func flatMap<S : SequenceType>(transform: (Self.Generator.Element) throws -> S) rethrows -> [S.Generator.Element]
}

來自轉換的每個序列將被連線,產生包含每個序列的組合元素的陣列 - [S.Generator.Element]

組合字串陣列中的字元

例如,我們可以使用它來獲取主要字串陣列並將它們的字元組合成一個陣列:

let primes = ["2", "3", "5", "7", "11", "13", "17", "19"]
let allCharacters = primes.flatMap { $0.characters }
// => "["2", "3", "5", "7", "1", "1", "1", "3", "1", "7", "1", "9"]"

打破上面的例子:

  1. primes 是一個 [String](作為一個陣列是一個序列,我們可以在其上呼叫 flatMap(_:))。
  2. 轉換閉包涉及 primes 的一個元素,即 StringArray<String>.Generator.Element)。
  3. 然後閉包返回一個 String.CharacterView 型別的序列。
  4. 結果是一個陣列,其中包含來自每個轉換閉包呼叫的所有序列的組合元素 - [String.CharacterView.Generator.Element]

展平多維陣列

由於 flatMap(_:) 將連線從轉換閉包呼叫返回的序列,它可以用於展平多維陣列 - 例如將 2D 陣列轉換為 1D 陣列,將 3D 陣列轉換為 2D 陣列等。

這可以簡單地通過在閉包中返回給定元素 $0(巢狀陣列)來完成:

// A 2D array of type [[Int]]
let array2D = [[1, 3], [4], [6, 8, 10], [11]]

// A 1D array of type [Int]
let flattenedArray = array2D.flatMap { $0 }

print(flattenedArray) // [1, 3, 4, 6, 8, 10, 11]