如何在UINavigationController中实现自动转类型的泛型查找方法
可以通过泛型方法改造你的扩展,让方法直接返回指定类型的可选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 }
关键说明
- 泛型约束:
T: UIViewController确保我们只处理UIViewController及其子类,避免类型不匹配的问题。 - 简化遍历:用
first(where:)替代原有的for循环,代码更简洁且性能相当(找到第一个匹配项就停止遍历)。 - 自动类型转换:方法返回值为
T?,调用时Swift会自动完成类型转换,无需额外的as?强转。
内容的提问来源于stack exchange,提问作者Mohd Haider
相关产品推荐
相关产品推荐

