class BorderedButton: UIButton {
// Some properties
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.themeBorderedButton()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.themeBorderedButton()
}
func themeBorderedButton() {
//sets up the button
}
}
我一直在爲我的項目閱讀一些代碼,並且遇到了這個問題。我已經閱讀了Swift 2.0的初始化文檔,我知道override init
我們簡單地覆蓋了從UIView
開始的init,並且在我們通過編程創建按鈕時調用了這個初始化程序。當我們在Storyboard中創建一個按鈕時調用required init
。定製按鈕的初始化程序
我第一個問題是:
到底在哪中的代碼是這樣的required init
指定,因爲我看着NSCoder的所有超並沒有具有required init
的方法我第二個問題是:
究竟NSCoder我已閱讀文檔,我有一個粗略的理解,它傳遞的信息,但我需要知道任何超越t帽子?在一個非平凡的應用程序中,類NSCoder
會得到很多用處?
您能詳細說明向後兼容性部分嗎? – YellowPillow
當序列化對象時'NSCoder'存儲類名。當再次加載數據時,它會按名稱查找這些類。在Swift中重命名類,移動類,重命名模塊,更改類可見性,更改類註釋,甚至重命名類所在的文件都可能導致內部類名更改。即使只是更新到一個新的Swift版本也會導致名稱改變。雖然你可以告訴NSCoder關於改變的類名,但這是一項單調乏味的工作,隨着你的應用程序的不斷增長,你會隨着時間的推移收集大量神祕的類名。 – fluidsonic
另外'NSCoder'需要大量的處理以避免在任何時候它看到意外類型的值。實際上,我們發佈了應用更新,在應用啓動時,大多數用戶都會崩潰。我們注意到只有在發佈之後,因爲這些用戶的舊數據與我們在測試期間沒有注意到的稍微不同的類名稱。很難跟蹤這些變化。 – fluidsonic