使用 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]