如何覆盖私有方法并快速调用超级?
Posted
技术标签:
【中文标题】如何覆盖私有方法并快速调用超级?【英文标题】:how to override private method and call super in swift? 【发布时间】:2017-07-21 03:51:45 【问题描述】:我们知道,如果你需要在 swift 中重写基类中的方法,你必须在该方法之前声明“override”关键字。 如果该方法是私有的,您仍然可以快速“覆盖”它,只需添加 NO override 关键字。但是,你不能调用 super.MethodName(),这是我的问题。
说,UINavigationController 中有一个私有方法,即“_startCustomTransition”,我可以在我的自定义 MyNavigationController.swift 中执行此操作
class MyNavigationController: UINavigationController
func _startCustomTransition()
// I can not call super._startCustomTransition()
那么,我该怎么做那个超级调用呢?谢谢。
【问题讨论】:
您应该可以使用 super --- 调用 performSelector: (***.com/questions/41951473/…) 或使用方法 swizzling (***.com/questions/39562887/…) 来实现此行为。 你不能调用 super 的原因是因为你的类MyNavigationController
继承自类 UINavigationController
并且它没有一个名为 _startCustomTransition()
的方法在这种情况下使用 @987654327正如 Amresh Kumar 所提到的,@ 方法很可能是您最好的选择
【参考方案1】:
你必须欺骗 Swift 编译器,这样的方法存在。为此,您可以简单地将 Object-C 扩展声明添加到项目的桥接头中:
@import UIKit;
@interface UINavigationController(PrivateMethods)
- (void)_startCustomTransition;
@end
现在,您可以毫无问题地覆盖该方法:
class MyNavigationController: UINavigationController
override func _startCustomTransition()
super._startCustomTransition()
编辑:您必须在 Objective-C 扩展中声明该方法,因为我认为没有实现它就无法在 Swift 扩展中声明方法。非常欢迎提出建议。 :)
【讨论】:
为什么要麻烦整个目标 C 更难的部分并使用 swift 扩展 这应该适用于纯 Swift,当您可以声明一个方法而不实现它时。 它确实有效只是想知道你为什么用 Objective C 代码回答了一个快速的问题 我的项目没有桥接头文件怎么办?这是一个纯 Swift 项目。即,我在创建项目时选择了 Swift 作为项目的语言。 重写一个方法只是为了调用它的超类的实现有什么意义?如果您根本不覆盖该方法,您不会获得相同的功能吗?【参考方案2】:从 Swift 5.3(可能还有旧版本)开始,关键字“internal”提供了您正在寻找的访问级别。
override internal func f()
super.f()
请参阅 Swift 编程语言文档中的访问控制,https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html
【讨论】:
Method does not override any method from its superclass
以上是关于如何覆盖私有方法并快速调用超级?的主要内容,如果未能解决你的问题,请参考以下文章
如何连接不同的计算机加入频道并在超级账本上实时查看调用内容(交易)?