使用 flatMap() 从数组转换中过滤掉 nil

可以使用 flatMap(_:) 以类似的方式,以 map(_:) 以便通过应用变换的序列的元素来创建一个数组。

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

与此版本的 flatMap(_:) 的不同之处在于,它希望变换闭包为每个元素返回一个 OptionalT?。然后它将安全地打开这些可选值中的每一个,过滤掉 nil - 产生一个 [T] 阵列。

例如,你可以使用 Int 的可用 String 初始化程序[String] 转换为 [Int] ,过滤掉任何无法转换的元素:

let strings = ["1", "foo", "3", "4", "bar", "6"]

let numbersThatCanBeConverted = strings.flatMap { Int($0) }

print(numbersThatCanBeConverted) // [1, 3, 4, 6]

你还可以使用 flatMap(_:) 的功能来过滤掉 nil,以便简单地将一个选项数组转换为非选项数组:

let optionalNumbers : [Int?] = [nil, 1, nil, 2, nil, 3]

let numbers = optionalNumbers.flatMap { $0 }

print(numbers) // [1, 2, 3]