Swift做子类inheritance初始化?

我有以下代码:

class Parent { var foo: Int init(someNum: Int) { self.foo = someNum } } class Child: Parent { } var parent = Parent(someNum: 999) println(parent.foo) // prints "999" var child = Child(someNum: 3872) println(child.foo) // prints "3872" 

在苹果公司2014年的WWDC“Intermediate Swift”video中,他表示,默认情况下,初始化程序不会被inheritance,除非它的存储属性有默认值。 然而,在子类Child没有foo默认值,但它明确地inheritance了init(someNum:)方法。 我是否理解错误的解释还是还有其他的事情呢?

从苹果文档:

子类默认情况下不会inheritance它们的父类初始化程序。 但是,如果满足某些条件,超类初始化器会自动inheritance。 在实践中,这意味着在许多常见场景中,您不需要编写初始化程序覆盖,只要安全,就可以用最less的努力inheritance超类初始化程序。

假设您为在子类中引入的任何新属性提供默认值,则适用以下两个规则:

规则1如果你的子类没有定义任何指定的初始值设定项,它将自动inheritance它所有的超类指定的初始值设定项。

规则2如果你的子类提供了它的所有超类指定的初始化符的实现,或者按照规则1inheritance它们,或者提供一个自定义的实现作为其定义的一部分,那么它将自动inheritance所有的超类方便初始化符。

即使您的子类添加了更多便利初始值设定项,这些规则也适用。

在你的情况下,你没有在Child提供任何指定的初始化器。 因此,唯一指定的初始化器已经从Parentinheritance。

如果您将Child类修改为:

 class Child : Parent { var age : Int init (age : Int) { self.age = age super.init(foo: 10) } } 

你会看到你不能通过调用它的超类初始化器来创build一个Child类。 阅读更多。

编辑:

上述规则适用于更多不同的情况。 也许这个文档对你来说有些困惑,但是暂停一下,思考一下。 你有一个inheritance自拥有一个属性foo的超类的子类。 现在,如果你的子类没有添加任何属性,或者添加了具有默认值的属性,则不需要与超类中的初始化器不同的初始化器,所以你可以安全地使用它。 另一方面,如果添加一个没有默认值的属性,则不能使用超类中的初始化程序,因为添加的属性需要以某种方式进行初始化。 编译器会抱怨,你将不得不做两件事之一:

  1. 你应该在子类中实现一个指定的初始化器,它将分配新的属性,并调用超类中指定的初始化器。
  2. 你可以给你的属性添加一个默认值,你仍然可以使用超类的指定初始值设定项。