如何检查对象类型归属及过滤视图控制器数组排错
嘿,我来帮你搞定这两个Swift类型检查的问题,都是日常开发里经常碰到的场景,咱们一个个说:
1. 检查对象是否属于某一类型数组中的任意一种类型
这里分两种常见需求,你可以根据自己的场景选择:
精确匹配类型(不包含子类)
如果你需要严格匹配对象的实际类型(比如UITableViewController不会被当成UIViewController),可以用type(of:)获取对象的类型,再用数组的contains方法判断:
// 定义目标类型数组 let targetTypes: [Any.Type] = [UIViewController.self, UITableViewController.self] // 待检查的对象 let myVC = UIViewController() // 检查逻辑 let isMatch = targetTypes.contains { type(of: myVC) == $0 } print(isMatch) // 输出 true
匹配类型或其子类
如果允许子类也被匹配(比如UITableViewController属于UIViewController的子类,也需要返回true),可以用is关键字来做类型检查:
let targetTypes: [Any.Type] = [UIViewController.self] let myTableVC = UITableViewController() // 检查逻辑 let isMatch = targetTypes.contains { myTableVC is $0 } print(isMatch) // 输出 true
2. 过滤allViewControllers数组,排除ignoredViewControllerTypes中的类型
先给你正确的实现代码,再分析你可能踩的坑:
正确的过滤实现
假设你的数组是allViewControllers: [UIViewController],忽略类型数组是ignoredViewControllerTypes: [Any.Type],可以用filter结合刚才的类型检查逻辑:
// 示例数据 let allViewControllers: [UIViewController] = [ UIViewController(), UITableViewController(), UINavigationController() ] let ignoredViewControllerTypes: [Any.Type] = [UINavigationController.self, UITableViewController.self] // 过滤逻辑:保留不属于忽略类型的控制器 let filteredVCs = allViewControllers.filter { vc in !ignoredViewControllerTypes.contains { vc is $0 } } // 此时filteredVCs里只剩UIViewController实例
你可能遇到的失败原因
我猜你大概率是踩了下面某一个坑:
- 精确匹配类型而非包含子类:如果你用了
type(of: vc) == $0来判断,那么子类实例不会被过滤掉(比如UITableViewController不会被当成UIViewController排除),但实际需求可能是要排除父类及所有子类; - 类型数组声明错误:比如你把
ignoredViewControllerTypes声明成了[UIViewController]而不是[Any.Type],这样根本没法存类型本身(只能存实例); - 闭包语法错误:比如在
contains里的闭包写法不对,比如漏写了参数或者逻辑反了(用了contains而不是!contains)。
如果你的代码和上面的正确实现差异不大,可以对照这几点排查一下,应该就能解决问题啦。
内容的提问来源于stack exchange,提问作者Mark A. Donohoe
相关产品推荐
相关产品推荐

