对于Swift 2.0 / Xcode 7beta3中UIViewController的指定和便利初始化器有点混淆。我们的UIViewControllers都是在代码中定义的,没有Nibs
目前,A类继承自UIViewController,如此
class A : UIViewController {
convenience init() {
...
self.init(nibName:nil, bundle:nil)
...
}
}
然后B类继承自A类,并应覆盖Conven init并将其称为super.init()
class B : A {
convenience init() {
super.init()
...
}
}
编译器不允许使用必须在super.init()
答案 0 :(得分:11)
您需要指定初始值设定项,而不是convenience
:
class A : UIViewController {
init() {
super.init(nibName:nil, bundle:nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("")
}
}
class B : A {
override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("")
}
}
它为您提供了您正在寻找的继承结构。
答案 1 :(得分:3)
查看文档中的这些图像。
根据图像方便,初始化器不会被继承。因此,如果要继承,则必须将其设为指定的初始化程序。
class A : UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
class B : A {
override init() {
super.init()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
在这一点你可能想知道指定和便利初始化器之间的区别是什么?好吧,Convenience用于在同一个类中调用指定的初始值设定项,您可以使用它来进行一些设置。
答案 2 :(得分:0)
根据文件
规则2便捷初始值设定项必须从同一个类调用另一个初始值设定项。
您应该将其称为自己的初始化程序:
class B : A {
convenience init() {
init()
...
}
}
init()自动从它的超类版本
继承答案 3 :(得分:0)
以下是如何通信指定的初始化器和便利初始化器的规则 规则1: 指定的初始化程序必须从其直接超类调用指定的初始化程序。
规则2: 便捷初始值设定项必须从同一个类调用另一个初始值设定项。
规则3: 便利初始化程序必须最终调用指定的初始化程序。
记住这一点的一个简单方法是:
指定的初始值设定项必须始终委派。 便利初始化程序必须始终委托。