Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 子类是否继承初始值设定项?_Ios_Swift_Inheritance - Fatal编程技术网

Ios 子类是否继承初始值设定项?

Ios 子类是否继承初始值设定项?,ios,swift,inheritance,Ios,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)

我有以下代码:

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”视频中,他表示,除非其存储属性有默认值,否则初始值设定项不会默认继承。但是,子类
Child
中没有
foo
的默认值,但它显然继承了
init(someNum:)
方法。我理解的解释是错误的还是有其他原因?

来自苹果文档:

默认情况下,子类不继承其超类初始值设定项。 但是,如果 满足某些条件。实际上,这意味着您不需要 需要在许多常见场景中编写初始值设定项重写,并且可以 继承超类初始值设定项时,尽可能不费力 这样做是安全的

假设您为您创建的任何新属性提供默认值 在子类中引入以下两条规则:

规则1如果子类未定义任何指定的初始值设定项,则 自动继承其所有超类指定的初始值设定项

规则2 如果您的子类提供了其所有 超类指定初始值设定项,方法是根据 规则1,或者通过提供自定义实现作为其 然后它自动继承所有的超类 方便初始化器

即使您的子类增加了更多的便利性,这些规则仍然适用 初始化者

在您的情况下,您没有在
Child
中提供任何指定的初始值设定项。因此,只有一个指定的初始值设定项是从父级继承的

如果将
子类修改为:

class Child : Parent {
  var age : Int
  init (age : Int) {
     self.age = age
    super.init(foo: 10)
  }
}
您将看到,无法通过调用超类初始值设定项来创建
子类。

编辑:

上述规则适用于更不同的场景。也许这些文件让你有点困惑,但让我们停下来想一想。您有一个子类继承自一个超类,该超类有一个属性
foo
。现在,如果您的子类没有添加任何属性,或者添加了带有默认值的属性,则不需要与超类中的初始值设定项不同的初始值设定项,因此您可以安全地使用它。另一方面,如果添加的属性没有默认值,则无法使用超类中的初始值设定项,因为添加的属性需要以某种方式初始化。编译器会抱怨,您必须执行以下两项操作之一:

  • 您应该在子类中实现一个指定的初始值设定项,该初始值设定项将分配新属性,并在超类中调用指定的初始值设定项
  • 您可以向属性中添加默认值,并且仍然可以使用超类中指定的初始值设定项

  • 如果子类中有任何新属性的默认值,则这些规则适用。但是,我没有在
    Child
    类中提供任何默认值;它是空的,所以规则不应该适用,是吗?更新了我的答案。希望现在一切都清楚了。啊“…为您引入的任何新属性提供默认值…”因此,由于我没有引入任何新属性,因此可以安全地继承初始值设定项。下次我真的应该更仔细地阅读。Swift中的规则看起来非常复杂和困难,直到你仔细思考它们,然后你发现它们绝对正确,需要这样做。