2015-04-06 56 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