使用 flatMap() 从数组转换中过滤掉 nil
可以使用 flatMap(_:)
以类似的方式,以 map(_:)
以便通过应用变换的序列的元素来创建一个数组。
extension SequenceType {
public func flatMap<T>(@noescape transform: (Self.Generator.Element) throws -> T?) rethrows -> [T]
}
与此版本的 flatMap(_:)
的不同之处在于,它希望变换闭包为每个元素返回一个 Optional值 T?
。然后它将安全地打开这些可选值中的每一个,过滤掉 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]