当init NSCoder是Swift基类中的便捷方法时,在子类中正确初始化NSCoder

时间:2016-02-19 08:58:07

标签: swift 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)中的所有属性,以便能够移除便利并执行{{1} } super.init(coder: aDecoder)

我在Swift中阅读了有关init规则的内容,但仍然不明白为什么Martin在这种情况下无法继承Martin中的方便init。

1 个答案:

答案 0 :(得分:0)

因为the rules说明了

  
      
  1. 指定的初始化程序必须从其直接超类调用指定的初始值设定项。
  2.   
  3. 便捷初始化程序必须从同一个类调用另一个初始化程序。
  4.   
  5. 便利初始化程序必须最终调用指定的初始化程序。
  6.