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
。
因此,沒有辦法讓它不工作,而不需要使'init?(coder aDecoder:NSCoder)'非方便的方法嗎?我認爲使用規則2我可以讓它工作。 規則2 '如果您的子類提供了其所有超類指定的初始化方法的實現 - 或者通過按照規則1繼承它們,或者通過提供自定義實現作爲其定義的一部分 - 那麼它會自動繼承所有超類方便initializers.' – petard
一如既往的解決方案很簡單: '類馬丁:人{ 便利的init(){ self.init(名稱: 「馬丁」) } }' 這樣馬丁繼承所有的父母的initalizers – petard