NSView子类中的ByPass init(编码器)

时间:2015-04-06 13:17:55

标签: macos cocoa swift

我正在创建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设计,在调用超类初始化器之前需要初始化所有常量。但这里有什么办法吗?我有任何设计错误吗?)

1 个答案:

答案 0 :(得分:1)

init?(coder:NSCoder)初始值设定项是强制性的,这是非常烦人的,因为通常你不需要它。让我们希望在未来的Cocoa版本中发生这种变化。

但是有希望。当Xcode告诉您需要该初始化程序时,它实际上为您提供了从内置模板中包含简单版本的选项。它看起来像这样:

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

这里要注意的有趣事是fatalError()。这实际上也使你所询问的错误无声无息。发生这种情况是因为该函数标有@noreturn注释,编译器将其作为提示,它可以停止执行检查,因为fatalError()之后的代码不会执行。

所以你可以保留你那个很好的严格的非变量let实例变量: - )