如何过滤成功转换为某种类型的Swift序列的元素?

时间:2017-03-24 00:11:48

标签: swift

我有时想从序列中提取特定类型的所有元素,并将它们作为该类型的序列返回(如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! }

这两者都感觉有点尴尬并重复类型检查。还有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

compactMap(_:)就是你想要的。来自docs

  

返回一个数组,其中包含使用此序列的每个元素调用给定转换的非零结果。

因此,出于您的目的,您可以像这样使用它:

list.compactMap { $0 as? SomeType }

如果您想要Swift3版本,请参阅编辑历史记录