为什么要在Swift类中使用所需的初始化程序?

前端之家收集整理的这篇文章主要介绍了为什么要在Swift类中使用所需的初始化程序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图了解在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 :)初始化器?所需的指定使编译器的恐惧平静。

猜你在找的Swift相关文章