Since 斯威夫特 4.1你可以使用紧凑地图:
let possibles:[Int?] = [nil, 1, 2, 3, nil, nil, 4, 5]
let actuals = possibles.compactMap { $0 }
(Swift 4.1 用 CompactMap 替换了一些 FlatMap 的重载。
如果您对此感兴趣,请参阅以下示例:https://useyourloaf.com/blog/replacing-flatmap-with-compactmap/ https://useyourloaf.com/blog/replacing-flatmap-with-compactmap/
)
With Swift 2b1,你可以简单地做
let possibles:[Int?] = [nil, 1, 2, 3, nil, nil, 4, 5]
let actuals = possibles.flatMap { $0 }
对于早期版本,您可以使用以下扩展名对此进行填充:
extension Array {
func flatMap<U>(transform: Element -> U?) -> [U] {
var result = [U]()
result.reserveCapacity(self.count)
for item in map(transform) {
if let item = item {
result.append(item)
}
}
return result
}
}
需要注意的是(对于 Swift 2 也是如此),您可能需要显式键入转换的返回值:
let actuals = ["a", "1"].flatMap { str -> Int? in
if let int = str.toInt() {
return int
} else {
return nil
}
}
assert(actuals == [1])
欲了解更多信息,请参阅http://airspeedvelocity.net/2015/07/23/changes-to-the-swift-standard-library-in-2-0-betas-2-5/ http://airspeedvelocity.net/2015/07/23/changes-to-the-swift-standard-library-in-2-0-betas-2-5/