首页 > 解决方案 > 按类过滤对象数组不起作用

问题描述

我有一个UIStackView包含UIView我创建的类的对象或对象,称为MyView.

MyView是 的子类UIView

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

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

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

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

我喜欢这些什么都不说的信息。

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

我喜欢它的编译方式Any

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

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

有没有办法测试子类?

标签: arraysswiftclassfilter

解决方案


我猜allViews是一个数组UIView

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

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

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

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

推荐阅读