2016-02-19 44 views
2

這裏是我的代碼:正確初始化NSCoder在初始化時,子類NSCoder是基類斯威夫特方便的方法

import Foundation 


class Person: NSObject, NSCoding { 

var name: String 



init(name: String) { 
    self.name = name 
} 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(name, forKey: "name") 
} 

required convenience init?(coder aDecoder: NSCoder) { 

    let name = aDecoder.decodeObjectForKey("name") as! String 

    self.init(name: name) 

} 
} 


class Martin: Person { 

init() { 
    self.init(name: "Martin") 
} 

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

} 

let p = Martin() 

print(p.name) 

出於某種原因,我總是最後變成在一個catch-22的情況下,唯一的辦法我看到使這項工作是在required convenience init?(coder aDecoder: NSCoder)到能夠明確初始化所有屬性清除的方便和在Martin

我讀到斯威夫特在init規則做super.init(coder: aDecoder),仍然不明白爲什麼Martin不能繼承便利的init在這種情況下從Person

回答

0

因爲the rules狀態

  1. 一個指定初始化必須調用其直接超類的指定初始化。
  2. 便利初始值設定項必須從同一個類中調用另一個初始值設定項。
  3. 便捷初始值設定項最終必須調用指定的初始值設定項。
+0

因此,沒有辦法讓它不工作,而不需要使'init?(coder aDecoder:NSCoder)'非方便的方法嗎?我認爲使用規則2我可以讓它工作。 規則2 '如果您的子類提供了其所有超類指定的初始化方法的實現 - 或者通過按照規則1繼承它們,或者通過提供自定義實現作爲其定義的一部分 - 那麼它會自動繼承所有超類方便initializers.' – petard

+0

一如既往的解決方案很簡單: '類馬丁:人{ 便利的init(){ self.init(名稱: 「馬丁」) } }' 這樣馬丁繼承所有的父母的initalizers – petard

相關問題