arrays - 按类过滤对象数组不起作用
问题描述
我有一个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
。如果这是真的,如果它只能过滤某些类,为什么还要允许程序员在过滤器上指定任何类?
有没有办法测试子类?
解决方案
我猜allViews
是一个数组UIView
。
您应该使用compactMap
,它将映射到子类的数组,丢弃任何nil
值(由 产生as?
):
let views = allViews.compactMap { $0 as? MyView }
注意这里views
已经是类型[MyView]
;看一下compactMap
的方法签名就明白了:
func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
推荐阅读
- java - 检查字符串数字数组是否包含符号
- python - 我正在尝试读取文件夹路径,但我收到 'str' has no attribute 'dir' 错误消息
- azure-web-app-service - Azure 应用服务不反映来自 ftp 的文件更改
- matlab - 我的泰勒级数图代码 cos(2x) 而不是 Matlab 中的 cos(x)
- javascript - 单击相应的删除按钮时,如何在每个列表项旁边添加按钮以删除该项目
- mongodb - MongoDB获取数组中当前元素的索引
- javascript - 基于输入元素的类乘以HTML中的列表元素
- java - 如何在加工库中制作3D
- javascript - 使用 React Native 的 Android 和 iOS 的关闭按钮圆形图标
- python - Python:如何使用包含范围的 dict 加载 json