这是我的代码:
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)
中的所有属性,以便能够移除便利并执行{{1} } super.init(coder: aDecoder)
我在Swift中阅读了有关init规则的内容,但仍然不明白为什么Martin
在这种情况下无法继承Martin
中的方便init。
答案 0 :(得分:0)
因为the rules说明了
- 指定的初始化程序必须从其直接超类调用指定的初始值设定项。
- 便捷初始化程序必须从同一个类调用另一个初始化程序。
- 便利初始化程序必须最终调用指定的初始化程序。
醇>