Swift UINavigationController子类中的强制init覆盖
我目前正在为一个服务于视图控制器流的框架继承UINavigationController(在某种程度上,像UI
ImagePickerController一样)
这是我的实现示例,简化为尽可能简单,可以在游乐场中运行. import UIKit public class MyNavigationController: UINavigationController { public var anyVar: Int? public init(anyVar: Int) { let viewController = UIViewController() super.init(rootViewController: viewController) self.anyVar = anyVar } required public init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } } let navigationController = MyNavigationController(anyVar: 42) 最后一行是崩溃,有一个EXC_BAD_INSTRUCTION.当我在Xcode中运行时,它在运行时告诉我init(nibName nibNameOrNil:String?,bundle nibBundleOrNil:NSBundle?)丢失了. 如果我覆盖该方法: public override init(nibName nibNameOrNil: String?,bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil,bundle: nibBundleOrNil) } ……一切运作良好:您可以尝试自己的游乐场. 我不明白为什么.这对我来说听起来不合逻辑. UIViewController文档说:
但我的init(nibName nibNameOrNil:String?,bundle nibBundleOrNil:NSBundle?)覆盖从super.init(rootViewController:viewController)初始化调用! 我仍然无法理解为什么覆盖该方法并调用super使程序更好地工作. IMO,覆盖一个方法,而只调用super.thisMethod是完全没用的,它只在调用堆栈中添加一个方法调用. 我必须遗漏一些关于Swift init方法的要点,但我无法弄清楚是什么. 解决方法
这是因为Swift继承初始化器的方式.如果未在当前类中声明任何初始值设定项,则编译器将从父类继承所有初始值设定项.但是如果你覆盖/添加新的初始化器(并且你用init(anyVar :)做),Swift将不会自动从父类继承初始化器,因此无法从子类访问它们,这会导致运行时崩溃.
如果您对超出此行为的原因感兴趣,可以查看Intermediate Swift部分和2014年WWDC(约34分钟标记,他们正在谈论初始化器继承) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |