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