簡體   English   中英

init編碼器究竟是什么?

[英]What exactly is init coder aDecoder?

我正在從在線課程學習iOS開發,每當我創建自定義視圖(自定義表格視圖單元格,集合視圖單元格等)時,教師總是實現此初始化程序:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

為什么我總是要打電話給這個? 它有什么作用? 我可以在init中放置屬性嗎?

我將從相反的方向開始這個答案:如果你想將視圖的狀態保存到磁盤怎么辦? 這稱為序列化 反過來是反序列化 - 從磁盤恢復對象的狀態。

NSCoding協議定義了兩個序列化和反序列化對象的方法:

encodeWithCoder(_ aCoder: NSCoder) {
    // Serialize your object here
}

init(coder aDecoder: NSCoder) {
    // Deserialize your object here
}

那么為什么在您的自定義類中需要它? 答案是Interface Builder。 將對象拖到故事板上並對其進行配置時,Interface Builder會將該對象的狀態序列化到磁盤上,然后在故事板出現在屏幕上時對其進行反序列化。 您需要告訴Interface Builder如何執行這些操作。 至少,如果你沒有向你的子類添加任何新屬性,你可以簡單地讓超類為你做包裝super.init(coder: aDecoder)包,因此super.init(coder: aDecoder)調用。 如果您的子類更復雜,則需要為子類添加自己的序列化和反序列化代碼。

這與Visual Studio的方法形成對比,后者是將代碼寫入隱藏文件以在運行時生成對象。

實現該初始化程序的要求是兩件事的結果:

  1. 利斯科夫替代原則 如果S是T的子類(例如, MyViewControllerViewController的子類),則S對象( MyViewController實例)必須能夠替換T對象( ViewController實例)所在的位置。

  2. 如果在子類中顯式定義了任何初始值設定項,則不會在Swift中繼承初始值設定項。 如果顯式提供了一個初始化程序,則必須顯式提供所有其他初始化程序(然后可以只調用super.init(...) )。 請參閱此問題以獲取理由。 它是Java,但仍然適用。

通過第1點,原始ViewController可以做的一切, MyViewController子類應該能夠做到。 一個這樣的事情是能夠從給定的NSCoder初始化。 到第2點,您的MyViewController子類不會自動繼承此功能。 因此,您必須手動提供滿足此要求的初始化程序。 在這種情況下,您只需要委托超類,讓它做它通常會做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM