Swift 2.0子类化UIViewController的子类并调用便捷初始化器

时间:2015-07-15 21:50:23

标签: ios swift uiviewcontroller

对于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()

上调用超类'...'错误的指定初始值设定项

4 个答案:

答案 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便捷初始值设定项必须从同一个类调用另一个初始值设定项。

来自https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html(Initializer班级类型的委派

您应该将其称为自己的初始化程序:

    class B : A {
       convenience init() {
         init()
         ...
       }    
    }

init()自动从它的超类版本

继承

答案 3 :(得分:0)

以下是如何通信指定的初始化器和便利初始化器的规则 规则1: 指定的初始化程序必须从其直接超类调用指定的初始化程序。

规则2: 便捷初始值设定项必须从同一个类调用另一个初始值设定项。

规则3: 便利初始化程序必须最终调用指定的初始化程序。

记住这一点的一个简单方法是:

指定的初始值设定项必须始终委派。 便利初始化程序必须始终委托