除了能够通过从序列的转换元素中过滤掉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"]"
分解上面的例子:
primes是一个[String](因为数组是一个序列,我们可以调用flatMap(_:)它)。
转换闭包采用primesa String( Array<String>.Generator.Element)的元素之一。
然后闭包返回一个类型为 的序列String.CharacterView。
结果是一个包含来自每个转换闭包调用的所有序列的组合元素的数组 – [String.CharacterView.Generator.Element]。
正如flatMap(_:)将从转换闭包调用返回的序列连接起来一样,它可用于展平多维数组——例如将二维数组变成一维数组,将 3D 数组变成二维数组等。
这可以简单地通过$0在闭包中返回给定元素(嵌套数组)来完成:
// [[Int]] 类型的二维数组 let array2D = [[1, 3], [4], [6, 8, 10], [11]] // [Int] 类型的一维数组 let flattenedArray =array2D.flatMap{ $0 } print(flattenedArray) // [1, 3, 4, 6, 8, 10, 11]