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

如何在UINavigationController中实现自动转类型的泛型查找方法

实现UINavigationController泛型查找指定类型ViewController并自动类型转换

可以通过泛型方法改造你的扩展,让方法直接返回指定类型的可选ViewController,无需手动强转。以下是优化后的代码:

改造后的扩展

extension UINavigationController {
    // 带类型参数的版本,明确指定查找类型
    func controller<T: UIViewController>(ofType type: T.Type) -> T? {
        return viewControllers.first { $0 is T } as? T
    }
    
    // 更简洁的无参数版本,利用Swift类型推断自动匹配
    func controller<T: UIViewController>() -> T? {
        return viewControllers.first { $0 is T } as? T
    }
}

调用方式

方式1:带类型参数(与你期望的调用形式完全匹配)

if let controller: MyController = self.navigationController?.controller(ofType: MyController.self) {
    // 直接使用controller,已自动转为MyController类型
}

方式2:无参数(利用类型推断,代码更简洁)

// 直接通过赋值时的类型推断匹配
if let controller: MyController = self.navigationController?.controller() {
    // 使用controller
}

// 或者结合as?语法
if let controller = self.navigationController?.controller() as MyController? {
    // 使用controller
}

关键说明

  1. 泛型约束:T: UIViewController确保我们只处理UIViewController及其子类,避免类型不匹配的问题。
  2. 简化遍历:用first(where:)替代原有的for循环,代码更简洁且性能相当(找到第一个匹配项就停止遍历)。
  3. 自动类型转换:方法返回值为T?,调用时Swift会自动完成类型转换,无需额外的as?强转。

内容的提问来源于stack exchange,提问作者Mohd Haider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:45:44