我对flatMap有点困惑(加入Swift 1.2)
说我有一些可选类型的数组,例如
let possibles:[Int?] = [nil,1,2,3,nil,4,5]
在Swift 1.1中,我会做一个过滤器,然后是这样的地图:
let filtermap = possibles.filter({ return $0 != nil }).map({ return $0! }) // filtermap = [1,5]
我一直试图用flatMap这样做:
var flatmap1 = possibles.flatMap({ return $0 == nil ? [] : [$0!] })
和
var flatmap2:[Int] = possibles.flatMap({ if let exercise = $0 { return [exercise] } return [] })
我更喜欢最后一个方法(因为我不需要执行一个强制解开$ 0!…我很害怕这些,并且不惜一切代价避免它们),除了我需要指定Array类型。
有没有其他的选择,通过上下文来确定类型,但是没有强制的展开?
使用Swift 2 b1,你可以简单地做
let possibles:[Int?] = [nil,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/