Swift - Required Initializer与Delegating初始化程序之间的一点混淆

时间:2016-11-23 19:33:54

标签: swift polymorphism

对于Swift类,我在必需和委托初始值设定项之间存在一些混淆。

正如您在我的示例代码中所看到的,NewDog可以通过2种方式之一进行初始化。如您所见,您可以通过在初始化时仅提供年龄来初始化,在这种情况下,将分配默认名称(" Buddy")。

我还不明白为什么NewDog类需要初始化程序所需的关键字,如果该初始化程序甚至没有被使用?请参阅.. var georgie正在使用常规初始化程序(不是NewDog中所需的初始化程序),它可以正常工作。

那么,如果它是......实际上是不是需要它的重点是什么? *如果我带走了初始化程序,编译器会对我大吼大叫说“#34; required'初始化程序' init'必须由' Dog'"。

的子类提供

好吧......我把它放回去......但是我甚至不必使用它,因为NewDog中的第一个初始化程序正在完成所有的成员属性初始化...我看不到这里的逻辑。

class Dog {
    var name : String
    required init(_ name: String) {
        self.name = name
    }
}

class NewDog: Dog {
    var age : Int?
    init(age: Int, name: String) {
        super.init(name)
        self.age = age
    }

    required init(_ name: String) {
        super.init(name)
    }
}

var georgie = NewDog(age: 6, name: "Georgie")
georgie.age

有人可以向我解释所需关键字的用途吗?我猜它只是告诉编译器"嘿......冷静下来...名称属性将在我们的子类中初始化,因为你在叫我要求它...所以只是放松一下我将自己处理。我将在我自己创建的显式子类初始化程序中执行此操作" ...

*****也!额外的问题:NewDog中哪个初始化器是指定初始化器?

由于

1 个答案:

答案 0 :(得分:1)

required初始化程序意味着每个子类还必须实现相同的初始化程序。由于您在init(_:)类中需要Dog初始值设定项,因此Dog的每个子类(及其子类)也必须提供相同的required init(_:)初始化程序。

从外观上看,您无需在init(_:)类中创建Dog初始值设定项。删除该关键字,然后您可以从init(_:)类中删除NewDog初始值设定项。

奖励 - init类中的NewDog个方法都被指定为初始值设定项,因为它们都不是便利初始化程序。

您需要了解默认,便利和所需初始化程序的差异和用法。 Intializers一书的The Swift Programming Language部分明确涵盖了这一点。

相关问题