gpt4 book ai didi

Swift - Required Initializer 与 Delegating initializer 之间的一点混淆

转载 作者:行者123 更新时间:2023-11-28 16:02:40 26 4
gpt4 key购买 nike

当涉及到 Swift 类时,我对必需的初始化器和委托(delegate)的初始化器有点混淆。

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

我还不明白的是,为什么 NewDog 类需要初始化器的 required 关键字,如果甚至没有使用该初始化器?看.. 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

有人可以向我解释一下 required 关键字的用途吗?我猜它只是告诉编译器“嘿......冷静......名称属性将在我们的子类中初始化,因为你对我大喊大叫要求它......所以冷静下来,我会处理它是我自己的。我将在我自己创建的显式子类初始值设定项中完成它“...

*****还有!奖励问题:NewDog 中的哪个初始化器是指定初始化器?

谢谢

最佳答案

必需 初始化器意味着每个子类也必须实现相同的初始化器。由于您在 Dog 类中创建了所需的 init(_:) 初始化程序,因此 Dog 的每个子类(及其子类)也必须提供相同的 需要 init(_:) 初始化程序。

从表面上看,您不需要在 Dog 类中创建 init(_:) 初始化程序。删除该关键字,然后您可以从 NewDog 类中删除 init(_:) 初始化程序。

好处 - NewDog 类中的两个 init 方法都是指定的初始化器,因为它们都不是便利初始化器。

您需要了解默认初始化器、便利初始化器和必需初始化器的区别和用法。 Intializers 中清楚地涵盖了所有这些内容节The Swift Programming Language书。

关于Swift - Required Initializer 与 Delegating initializer 之间的一点混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40772781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com