【发布时间】: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/…