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

请求将Objective-C获取导航控制器的代码转换为Swift

把Objective-C响应者链遍历代码转换成Swift

没问题,我帮你把这段通过遍历响应者链获取导航控制器的Objective-C代码转换成Swift版本,逻辑完全对齐,同时贴合Swift的语法规范:

原Objective-C代码回顾

- (UINavigationController *)targetNaviCtrl{ 
    if(!_targetNaviCtrl){ 
        UIResponder *target = self.nextResponder; 
        do { 
            target = target.nextResponder; 
        } while (![target isKindOfClass:UINavigationController.self] && target != nil); 
        _targetNaviCtrl = (UINavigationController *)target; 
    } 
    return _targetNaviCtrl; 
} 

// 注释:通过遍历响应者链,获取目标导航控制器以执行相关操作,这种方式常用于跨层级调用导航控制器的场景(比如自定义控件内触发页面跳转)

转换后的Swift代码

lazy var targetNaviCtrl: UINavigationController? = {
    var target: UIResponder? = self.next
    repeat {
        target = target?.next
    } while !(target is UINavigationController) && target != nil
    return target as? UINavigationController
}()

关键转换细节说明

  • 用Swift的lazy var实现懒加载逻辑,和OC的懒加载行为一致,仅在第一次访问属性时计算并缓存值
  • OC中的nextResponder属性在Swift中简化为next
  • 用Swift的repeat-while循环对应OC的do-while,确保循环体至少执行一次
  • 采用可选类型转换as? UINavigationController替代OC的强制转换,避免类型不匹配时的崩溃,更符合Swift的安全编程理念

这段代码的核心思路不变:沿着响应者链向上遍历,直到找到第一个UINavigationController实例,这种方式在自定义组件中非常实用,不需要硬编码依赖父控制器的层级关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:44:55