当我不使用Storyboard时,在所需的init中是否可以使用fatalError?(编码器aDecoder:NSCoder)?

Pet*_*kov 4 initialization mvvm ios swift

我有一个ViewController,需要初始化ViewModel: NSObject.

我的实施ViewController是:

class ViewController: UIViewController {

    let viewModel: ViewModel

    init(withViewModel viewModel: ViewModel) {
        self.viewModel = viewModel
        super.init(nibName: nil, bundle: nil)
    }

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

}
Run Code Online (Sandbox Code Playgroud)

ViewModel很简单override init:

class ViewModel: NSObject {

    override init() {
        super.init()
        // Some other logic
    }

}
Run Code Online (Sandbox Code Playgroud)

我明白,我需要required init?(coder aDecoder: NSCoder)ViewController实现中,因为它符合NSCoding协议.但我不确定那里是否安全fatalError.

当我改变fatalErrorsuper.init(coder: aDecoder)收到

属性'self.viewModel'未在super.init调用中初始化

我不想创建viewModel一个可选变量,因为在我的App逻辑中它不可能nil.

此外,当我init?(coder...改为

required init?(coder aDecoder: NSCoder) {
    self.viewModel = ViewModel()
    super.init(coder: aDecoder)
}
Run Code Online (Sandbox Code Playgroud)

这也不能满足我,因为viewModel它不是唯一的常量,需要在初始化期间实现ViewController.

所以,我的问题:

  • 拥有fatalError这种init方法是否安全?
  • 不在我的应用程序中使用Storyboard(仅适用于启动屏幕).我可以肯定,这种init?(coder...方法在任何情况下都不会运行吗?
  • 或者也许可以选择不写fatalError
  • 或者我需要一个完整的实现,因为在某些情况下我的应用程序将使用它?

谢谢你的帮助!

Vas*_*vev 8

由于您不使用故事板,因此可以禁用init,因此您将无法在代码中使用它:

@available(*, unavailable) required init?(coder aDecoder: NSCoder) {
    fatalError("disabled init")
}
Run Code Online (Sandbox Code Playgroud)