【问题标题】:Filtering an array of objects by class not working按类过滤对象数组不起作用
【发布时间】:2020-05-25 04:47:45
【问题描述】:

我有一个UIStackView,其中包含UIViews 或我创建的名为MyView 的类的对象。

MyViewUIView 的子类。

我想从该数组中提取 MyView 类的所有对象。

这是我尝试过的以及相应的错误:

let views = Array< MyView >(allViews).filter { $0 is MyView }

没有更多上下文,表达式的类型是模棱两可的

我喜欢这些无言的信息。

let views = Array<Any>(allViews).filter { $0 is MyView }

我喜欢它与 Any 的编译方式。

在这种情况下没有错误,但views 包含与myViews 相同的对象,没有过滤任何内容。

我知道MyViewUIView 的子类,所以这里快速测试的是对象是否属于UIView 类。如果这是真的,如果它只能过滤某些类,为什么还要允许程序员在过滤器上指定任何类?

有没有办法测试子类?

【问题讨论】:

  • allViews 是什么?

标签: arrays swift class filter


【解决方案1】:

我猜allViewsUIView 的数组。

您应该使用compactMap,它将映射到子类的数组,丢弃任何nil 值(由as? 产生):

let views = allViews.compactMap { $0 as? MyView }

注意这里views 已经是[MyView] 类型;看看compactMap的方法签名就明白了:

func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

【讨论】:

  • 太棒了,您的代码有效。我这里有一个错字。谢谢。
猜你喜欢
  • 2020-05-30
  • 2021-08-03
  • 2022-12-02
  • 1970-01-01
  • 2021-03-21
  • 2022-01-11
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多