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

Posted

技术标签:

【中文标题】Swift:在从初始化程序返回之前,不会在所有路径上调用“super.init”?【英文标题】:Swift: 'super.init' isn't called on all paths before returning from initializer? 【发布时间】:2018-11-25 00:36:29 【问题描述】:

我在我的一个类的 init 的最后一个大括号上收到此错误。这个类看起来像下面这样(我推销发生错误的地方):

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

我已经查看了here 和here 的解决方案,但两者似乎都是非常糟糕或对那个问题过于具体的解决方案,因此它们对我不起作用。

我希望能以这样的方式解决我的问题,它可以帮助我理解为什么会发生这个错误。

【问题讨论】:

请阅读 Swift 书中Initialization 章节。 【参考方案1】:

由于您继承自 UIViewController,因此您应该在您的 init 函数中设置变量后立即调用 super.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")
    


【讨论】:

为什么?请在问题请求时添加完整的解释,然后我可以接受答案 当你继承一个类并实现一个新的初始化函数或重写它自己的初始化函数时,你应该(几乎)总是调用super.init。举个例子,你继承自UIViewControllerUIViewController 有一些 init 函数,可用于初始化视图控制器。如果你不调用super.init,这些函数中的所有代码都不会被调用,并且视图控制器可能不会被初始化。 另外,为什么要将按钮和视图传递给视图控制器?似乎是你不应该做的事情 为什么这是个坏主意? “似乎是你不应该做的事情” 我得到了 'init' 的歧义使用。当我把它粘贴到初始化中时【参考方案2】:

这是我在 Swift 编程语言上找到的:

在第一阶段,每个存储的属性都由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始了,每个类都有机会在新实例被认为可以使用之前进一步自定义其存储属性。

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

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

【讨论】:

以上是关于Swift:在从初始化程序返回之前,不会在所有路径上调用“super.init”?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 和 Codable 类编译器错误:在从初始化程序返回之前,未在所有路径上调用“self.init”

在从初始化程序返回之前不调用 Super.init

如何在从 Swift 3 中的函数返回结果之前等待 URLSession 完成

为啥 UILable 在从另一个页面传递值之前不会显示?

从初始化程序返回而不初始化所有存储的属性swift ios

json.swift 错误是 Self.init 在委托初始化程序中的所有路径上都没有调用