当 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声明

  1. A designated initializer must call a designated initializer from its immediate superclass.
  2. A convenience initializer must call another initializer from the same class.
  3. A convenience initializer must ultimately call a designated initializer.