ios - 在需要的初始化中有 fatalError 可以吗?(编码器 aDecoder : NSCoder) when I don't use Storyboards?

标签 ios swift mvvm initialization

我有一个 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")
    }

}

ViewModel 具有简单的override init:

class ViewModel: NSObject {

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

}

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

当我将 fatalError 更改为 super.init(coder: aDecoder) 时,我收到了

property 'self.viewModel' not initialized at super.init call

我不想让 viewModel 成为可选变量,因为在我的 App 逻辑中它不能是 nil

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

required init?(coder aDecoder: NSCoder) {
    self.viewModel = ViewModel()
    super.init(coder: aDecoder)
}

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

那么,我的问题:

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

感谢您的帮助!

最佳答案

因为你不使用 Storyboard,你可以禁用你的 init,所以你将无法在代码中使用它:

@available(*, unavailable) required init?(coder aDecoder: NSCoder) {
    fatalError("disabled init")
}

关于ios - 在需要的初始化中有 fatalError 可以吗?(编码器 aDecoder : NSCoder) when I don't use Storyboards?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43920997/

相关文章:

swift - 改变平面中顶点的位置

ios - 如何向应用程序添加上下文菜单

Android,我是否使用 ViewModel 执行插入或更新?

mvvm - 这是 View 模型吗?

ios - ViewModel 类能否按照 MVVM 符合 iOS 中的 UITableviewDelegate 和 UITableViewDataSource

android - 用户向上滚动时无法单击 SliverPersistentHeader 上的操作按钮

iphone - 如何用字符串分隔的组件进行json解析

ios - 向复杂字典 Swift 添加值

c# - 当控件获得焦点时更新 ViewModel 中的属性

ios - 覆盖 touchesBegan : Error - method does not override any method from superclass