Swift:从初始化程序返回之前,不是在所有路径上都调用过“ super.init”吗?

时间:2018-11-25 00:36:30

标签: ios swift inheritance

我在我的一类初始化中的最后一个括号中遇到此错误。该类类似于以下内容(我向发生错误的地方推销):

class RecordingViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {

    let cameraButton:UIButton?
    let camPreview:UIView?

    init (cameraButton: UIButton!, camPreview: UIView!) {
        self.cameraButton = cameraButton
        self.camPreview = camPreview

    } //get error here

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    //do a bunch of other stuff
}

我一直在寻找herehere的解决方案,但两者似乎都是非常糟糕的解决方案,或者对于该问题过于具体,因此它们对我不起作用。

我一直希望以一种可以解决我的问题的方式解决问题,以帮助我理解为什么会发生此错误。

2 个答案:

答案 0 :(得分:2)

自从UIViewController继承以来,应在super.init函数中设置变量后立即调用init

当您继承一个类并实现新的init函数或覆盖其自己的init函数时,您应该(几乎)始终调用super.init。让我们以您的示例为例,您继承自UIViewController。 UIViewController具有一些初始化函数,可用于初始化视图控制器。如果不调用super.init,则不会调用这些函数中的所有代码,并且可能不会初始化视图控制器。

无论如何,这段代码应该对您有用:

class ViewController: UIViewController {

    var button: UIButton?

    init(button: UIButton) {
        self.button = button
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

答案 1 :(得分:0)

这是我在Swift编程语言中找到的内容:

  

在第一阶段,每个存储的属性由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,便开始第二阶段,并且在考虑将新实例准备就绪之前,每个类都有机会自定义其存储属性。

     

指定的初始值设定项必须确保由其类引入的所有属性在委托给超类初始值设定项之前都已初始化。

希望这可以解释这个问题。