2015-04-06 70 views
0

我正在创建NSView的子类。
以下是从操场NSView子类中的ByPass init(编码器)

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) 

如何摆脱错误需要的firstName中的init(编码器)来初始化我的代码。
我不会从IB的任何类型的MyTableCell视图。

(我同意按快捷设计,需要一个初始化所有的常数超类初始化器被调用之前,但有什么办法在这里?难道我做任何设计错误?)

回答

1

这是非常令人讨厌的是init?(coder:NSCoder)初始化器是强制性的,因为通常你不需要它。让我们希望未来的Cocoa版本发生这种变化。

但有希望。当Xcode告诉你需要这个初始化器时,它实际上给了你一个从内置模板中包含一个简单版本的选项。它看起来像这样:

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

有趣的事情要注意这里是fatalError()。这实际上也可以消除你所问的错误。发生这种情况的原因是该函数使用@noreturn注释标记,编译器将其作为暗示,因为fatalError()将永远不会执行,因此可以停止执行检查。

所以,你可以保持你的好严格的不可变let实例变量:-)

+1

更好的方式来想起来,这是* *实施,并明确崩溃,而不是默默地做着错误的事情在ObjC 。你总是需要一些东西,因为虽然你可能不愿意从一个笔尖加载视图,但他们被允许,并且Swift试图掩盖可能发生的事情,而不仅仅是期望的事情。 (毕竟,错误几乎总是由于“不应该”发生,但实际发生的事情)。 – 2015-04-06 18:47:07

+0

@RobNapier你知道编译器是否以某种特殊的方式处理'fatalError'? – 2015-04-06 18:50:28

+1

绝对。它包含'@ noreturn'属性,它告诉编译器该调用不会返回,所以其他所有内容都是不相关的。 – 2015-04-06 18:52:12