请求将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
相关产品推荐
相关产品推荐

