对于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中哪个初始化器是指定初始化器?
由于
答案 0 :(得分:1)
required
初始化程序意味着每个子类还必须实现相同的初始化程序。由于您在init(_:)
类中需要Dog
初始值设定项,因此Dog
的每个子类(及其子类)也必须提供相同的required init(_:)
初始化程序。
从外观上看,您无需在init(_:)
类中创建Dog
初始值设定项。删除该关键字,然后您可以从init(_:)
类中删除NewDog
初始值设定项。
奖励 - init
类中的NewDog
个方法都被指定为初始值设定项,因为它们都不是便利初始化程序。
您需要了解默认,便利和所需初始化程序的差异和用法。 Intializers一书的The Swift Programming Language部分明确涵盖了这一点。