当涉及到Swift类时,我需要初始化程序和委托初始化程序之间有点混淆。Swift - 必需的初始化程序与委托初始化程序之间的一点混淆
正如你可以在我的例子代码中看到的,NewDog可以用2种方式中的1种进行初始化。正如你所看到的,你可以通过初始化时提供初始化来初始化,在这种情况下,默认名称将被分配(“好友”)。
我不明白的是为什么NewDog类需要初始值设定项所需的关键字,如果初始化程序甚至没有被使用?请参阅.. var georgie正在使用常规初始化程序(不是NewDog中必需的初始化程序)并且它工作得很好。
那么它是什么需要,如果它是...其实..不是必需的? *如果我拿走那个初始化器,编译器就会大声说“必需”初始化器'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
那么有人可以向我解释什么是必需的关键字是什么?我的猜测是,它只是告诉编译器“嘿......冷静下来...... name属性将在我们的子类中初始化,因为你在大声喊我要求它...所以只需放松一下,我就会处理它在我自己的。我打算做一个明确的子类初始化,我创建自己“...
*****也!奖金问题:NewDog中的哪个初始化程序是指定初始化程序?
感谢
我只是在指定和要求之间的差异而感到困惑。不过谢谢。此外,Dog类中所需的init是用于多元语用的目的。制作了一个采用Dog类型并初始化并返回新实例的工厂。由于它采用了Dog类型,因此需要让编译器知道我可能正在传递Dog类型的子类,所以它不会让我大失所望。 – user7024499
所以,true或false ......用你的话来说,必须意味着“每个子类都必须实现相同的初始化器”,但是......并不意味着子类必须使用该初始化器。正如我上面的示例所显而易见的,该实例是使用不同的指定初始化程序创建的。 – user7024499
确实,“必需”表示它必须存在。这并不意味着它必须被使用。 – rmaddy