You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查对象类型归属及过滤视图控制器数组排错

嘿,我来帮你搞定这两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:18:14