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