当 init NSCoder 是 base class in Swift 中的便捷方法时,正确地在 sub class 中初始化 NSCoder
Correctly init NSCoder in sub class when init NSCoder is convenience method in base class in Swift
这是我的代码:
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)
出于某种原因,我总是陷入 22 条军规,我认为使这项工作有效的唯一方法是显式初始化 required convenience init?(coder aDecoder: NSCoder)
中的所有属性,以便能够消除便利并执行 super.init(coder: aDecoder)
在 Martin
我读了 Swift 中的初始化规则,仍然不明白为什么 Martin
在这种情况下不能从 Person
继承便利的初始化。
因为the rules声明
- A designated initializer must call a designated initializer from its immediate superclass.
- A convenience initializer must call another initializer from the same class.
- A convenience initializer must ultimately call a designated initializer.
这是我的代码:
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)
出于某种原因,我总是陷入 22 条军规,我认为使这项工作有效的唯一方法是显式初始化 required convenience init?(coder aDecoder: NSCoder)
中的所有属性,以便能够消除便利并执行 super.init(coder: aDecoder)
在 Martin
我读了 Swift 中的初始化规则,仍然不明白为什么 Martin
在这种情况下不能从 Person
继承便利的初始化。
因为the rules声明
- A designated initializer must call a designated initializer from its immediate superclass.
- A convenience initializer must call another initializer from the same class.
- A convenience initializer must ultimately call a designated initializer.