【问题标题】:Swift use of unimplemented initializer 'init()'快速使用未实现的初始化程序“init()”
【发布时间】:2014-10-27 15:19:57
【问题描述】:

第 1 部分

我正在使用NSExtensionPrincipalClass 而不是故事板编写今日小部件扩展。我实现了以下所需的初始化

required init(coder aDecoder: NSCoder) {
    tableView = UITableView()
    cellIdentifier = "kCellIdentifier"

    super.init(coder: aDecoder)
}

但是,当我运行该项目时,我收到以下错误

use of unimplemented initializer 'init()'

所以,通过在项目中添加这个额外的代码,它会解决问题,但在多个地方初始化变量似乎并不正确

override init() {
    tableView = UITableView()
    cellIdentifier = "kCellIdentifier"

    super.init()
}

第 2 部分

所以我在下面回答了问题的第 1 部分,但我仍然不知道为什么以下解决方案不起作用?

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    cellIdentifier = "kCell"
    tableView = UITableView()
    super.init(nibName: nil, bundle: nil)
}

根据 Swift 的文档

“如果您的子类提供其所有超类的实现 指定的初始化器——要么按照规则 1 继承它们,要么通过 提供自定义实现作为其定义的一部分——然后它 自动继承所有超类的便利 初始化器。”

在 UIViewController 中,init(nibName:bundle:) 是唯一指定初始化的,那为什么我不自动继承 init()init(coder:)

【问题讨论】:

  • Swift 对初始化器的处理有点违反直觉。在 Obj-C 中,所有初始化器都被每个子类继承,无论它们在层次结构中有多远。在 swift 中,初始化器仅在特定情况下被继承。你可能看到的是 Obj-C 调用了一个初始化器,它会在 Obj-C 中自动继承,但在 Swift 中却没有。我自己也遇到过这个。最终,我返回并重新阅读了 Swift 指南的初始化程序部分六遍,直到它变得有意义。这就是我的建议。 :-)
  • 是的,NSCoder 业务对 Swift 来说是一团糟。我和你做的一样。如果你从另一个控制器初始化一个控制器,它不需要 aDecoder,但如果你从故事板初始化,它就需要。凌乱,同意,但到目前为止我还没有找到解决办法。我什至在这里问过:stackoverflow.com/questions/26394009/…

标签: ios swift ios8


【解决方案1】:

所以这是我在重新阅读 swift 的初始化器章节并查看 UIViewController 头文件后的第一部分问题的解决方案

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

override init() {
    cellIdentifier = "kCellIdentifier"
    tableView = UITableView()
    super.init(nibName: nil, bundle: nil)
}

此解决方案的关键之一是init(nibName:bundle:),它是一个指定的初始化程序,无论您是否使用情节提要,都必须调用它。

钥匙带走:

  • 如果您在声明变量时没有为变量提供值,那么您将失去从超类继承的所有初始化程序。这意味着您必须提供自己的 init 或覆盖超类初始化程序并调用您的超类的适当指定初始化程序。此外,您必须实现所有必需的初始化程序。
  • 默认情况下,在 UIViewController 中,convenience init 将使用 nil 作为参数为您调用 init(nibName:bundle:)。因此,如果您没有继承默认的 init() 方法,那么您有责任覆盖它并调用 init(nibName:bundle:)

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2017-03-22
    • 2019-04-23
    相关资源
    最近更新 更多