Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么要在Swift类中使用所需的初始化程序?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我试图了解在Swift类中使用必需的关键字。 class someClass { required init() { // initializer implementation goes here } } 所需的并不强制我在我的子类中实现该方法。如果我想覆盖我父类所需的指定的初始化程序,我需要编写必需的而不是覆盖。我知道它是如何工作的,但不明白为什么我应该这样做。
我试图了解在Swift类中使用必需的关键字。
class someClass 
{
    required init() {
        // initializer implementation goes here
    }
}

所需的并不强制我在我的子类中实现该方法。如果我想覆盖我父类所需的指定的初始化程序,我需要编写必需的而不是覆盖。我知道它是如何工作的,但不明白为什么我应该这样做。

所需的好处是什么?
据我所知,像C#这样的语言没有这样的东西,只要重写就可以正常工作。

它实际上只是满足编译器的一种方式,以确保如果这个类有任何子类,它们将继承或实现这个相同的初始化程序。在这一点上存在疑问,因为规则是,如果一个子类具有自己的指定的初始化器,则不会继承超类的初始化器。因此,超类有可能具有初始化器,子类不具有初始化器。需要克服这种可能性。

编译器需要以这种方式满足的一种情况涉及协议,并且如下所示:

protocol Flier {
    init()
}
class Bird: Flier {
    init() {} // compile error
}

问题是如果Bird有一个子类,那个子类将必须实现或继承init,而且你没有保证。根据需要标记Bird的init可以保证。

或者,您可以将Bird标记为最终,从而保证相反,即它将永远不会有一个子类。

另一种情况是你有一个工厂方法,可以通过@L_616_11@同一个初始化器来创建一个类或其子类:

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子类中@L_616_11@init(name :)初始化器。但是编译器怎么能确保一个子类将有一个init(name :)初始化器?所需的指定使编译器的恐惧平静。

大佬总结

以上是大佬教程为你收集整理的为什么要在Swift类中使用所需的初始化程序?全部内容,希望文章能够帮你解决为什么要在Swift类中使用所需的初始化程序?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。