我正在创建NSView的子类 以下是我在游乐场的代码
class MyTableCell :NSView {
let firstName : String
init(name: String) {
firstName = name
super.init()
}
required init?(coder: NSCoder) {
super.init(coder: coder) <-- ERROR: firstName not initialised
}
}
let myName = "Test-Name"
var cell = MyTableCell(name: myName)
如何摆脱需要在init(编码器)初始化firstName的错误 我不会从IB中获取MyTableCell类型的任何视图。
(我同意根据swift设计,在调用超类初始化器之前需要初始化所有常量。但这里有什么办法吗?我有任何设计错误吗?)
答案 0 :(得分:1)
init?(coder:NSCoder)
初始值设定项是强制性的,这是非常烦人的,因为通常你不需要它。让我们希望在未来的Cocoa版本中发生这种变化。
但是有希望。当Xcode告诉您需要该初始化程序时,它实际上为您提供了从内置模板中包含简单版本的选项。它看起来像这样:
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
这里要注意的有趣事是fatalError()
。这实际上也使你所询问的错误无声无息。发生这种情况是因为该函数标有@noreturn
注释,编译器将其作为提示,它可以停止执行检查,因为fatalError()
之后的代码不会执行。
所以你可以保留你那个很好的严格的非变量let
实例变量: - )