2015-12-03 79 views
0
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會得到很多用處?

回答

1

UIView符合要求init(coder:)NSCoding協議。

UIKit使用NSCoder加載在故事板和XIB文件中定義的視圖,視圖層次結構和視圖控制器。

NSCoder是一種在iOS中存儲和加載結構化數據的方案。它主要用於NSKeyedArchiverNSKeyedUnarchiver

我不建議在除上述情況外的任何地方使用它,因爲在Swift中維護落後的comaptilbity變得更加困難。

+0

您能詳細說明向後兼容性部分嗎? – YellowPillow

+1

當序列化對象時'NSCoder'存儲類名。當再次加載數據時,它會按名稱查找這些類。在Swift中重命名類,移動類,重命名模塊,更改類可見性,更改類註釋,甚至重命名類所在的文件都可能導致內部類名更改。即使只是更新到一個新的Swift版本也會導致名稱改變。雖然你可以告訴NSCoder關於改變的類名,但這是一項單調乏味的工作,隨着你的應用程序的不斷增長,你會隨着時間的推移收集大量神祕的類名。 – fluidsonic

+1

另外'NSCoder'需要大量的處理以避免在任何時候它看到意外類型的值。實際上,我們發佈了應用更新,在應用啓動時,大多數用戶都會崩潰。我們注意到只有在發佈之後,因爲這些用戶的舊數據與我們在測試期間沒有注意到的稍微不同的類名稱。很難跟蹤這些變化。 – fluidsonic