我试图了解在Swift类中使用必需的关键字。
class SomeClass { required init() { // initializer implementation goes here } }
所需的并不强制我在我的子类中实现该方法。如果我想覆盖我父类所需的指定的初始化程序,我需要编写必需的而不是覆盖。我知道它是如何工作的,但不明白为什么我应该这样做。
所需的好处是什么?
据我所知,像C#这样的语言没有这样的东西,只要重写就可以正常工作。
它实际上只是满足编译器的一种方式,以确保如果这个类有任何子类,它们将继承或实现这个相同的初始化程序。在这一点上存在疑问,因为规则是,如果一个子类具有自己的指定的初始化器,则不会继承超类的初始化器。因此,超类有可能具有初始化器,子类不具有初始化器。需要克服这种可能性。
编译器需要以这种方式满足的一种情况涉及协议,并且如下所示:
protocol Flier { init() } class Bird: Flier { init() {} // compile error }
问题是如果Bird有一个子类,那个子类将必须实现或继承init,而且你没有保证。根据需要标记Bird的init可以保证。
或者,您可以将Bird标记为最终,从而保证相反,即它将永远不会有一个子类。
另一种情况是你有一个工厂方法,可以通过调用同一个初始化器来创建一个类或其子类:
class Dog { var name: String init(name: String) { self.name = name } } class NoisyDog: Dog { } func dogMakerAndNamer(whattype: Dog.Type) -> Dog { let d = whattype.init(name: "Fido") // compile error return d }
dogMakerAndNamer在Dog或Dog子类中调用init(name :)初始化器。但是编译器怎么能确保一个子类将有一个init(name :)初始化器?所需的指定使编译器的恐惧平静。