我有时想从序列中提取特定类型的所有元素,并将它们作为该类型的序列返回(如C#/ LINQ&#39; s IEnumerable.OfType<TResult>()
)。我一直在这样做:
list.filter { $0 is SomeType }.map { $0 as! SomeType }
或:
list.map { $0 as? SomeType }.filter { $0 != nil }.map { $0! }
这两者都感觉有点尴尬并重复类型检查。还有更好的方法吗?
答案 0 :(得分:4)
compactMap(_:)
就是你想要的。来自docs:
返回一个数组,其中包含使用此序列的每个元素调用给定转换的非零结果。
因此,出于您的目的,您可以像这样使用它:
list.compactMap { $0 as? SomeType }
如果您想要Swift3版本,请参阅编辑历史记录