当前位置: 首页 > 面试题库 >

为什么在Swift类中使用必需的初始化器?

景阳曜
2023-03-14
问题内容

我试图了解requiredSwift类中关键字的使用。

class SomeClass 
{
    required init() {
        // initializer implementation goes here
    }
}

required不会强迫我在子类中实现该方法。如果我要重写required指定初始化我的父类的我需要写required和不override。我知道它是如何工作的,但不明白为什么我应该这样做。

有什么好处required?据我所知,像C#这样的语言没有这样的东西,并且可以很好地工作override


问题答案:

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

需要以这种方式满足编译器的一种情况是协议,其工作方式如下:

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

问题是,如果Bird有一个子类,则该子类将必须实现或继承init,而您不能保证做到这一点。标记鸟initrequired不保证它。

另外,您可以将Bird标记为final,从而保证相反,即它永远不会有子类。

另一种情况是您拥有一个工厂方法,该方法可以通过调用相同的初始化程序来构成一个类或其子类:

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``init(name:)在Dog或Dog子类上调用初始化程序。但是,编译器如何确保子类具有init(name:)初始化程序?该required名称可以减轻编译器的恐惧。



 类似资料:
  • 问题内容: 我正在努力理解为什么我在使用Swift的iOS项目中遇到此编译器错误。如果我创建以下类: 我在“初始化前使用了变量’self.c’” 这一行上收到编译器错误。 起初我以为这是因为编译器无法验证该方法是否无法访问,但是后来我尝试将init方法混入一点: 这次的错误是“在初始化之前使用了变量’self.b’”(在同一行上)。这表明编译器 是 能够检查其性能的方法访问,所以据我可以看到应该有

  • 问题内容: 我正在寻找类似于Objective-C的class方法的行为,因为该方法在类初始化时被调用一次,此后不再被调用。 一个简单的闭合将非常时尚!而且很显然,当我们在结构闭包中使用“ s”而不是“ s”时,这一切都将非常匹配! 问题答案: 如果您有一个Objective-C类,最简单的方法就是重写。但是,请确保您的类的 子 类也被覆盖,否则您的类的 子 类可能会被多次调用!如果需要,可以使用

  • //[input type=“text”placeholder=“First Name”class=“form control”ng model=“FirstName”必填项] 下面是我的代码 elemntvalue=驱动程序。FindElement(By.XPath(//input[@placeholder='First Name']); 字符串名称required=elemntvalue。Ge

  • 报价王 JLS #8.1.3: 内部类不能声明静态初始值设定项 (§8.7)...... 这表现为: 现在既然Java的内部(非静态)类像其他类一样由类加载器加载,为什么我们不能为它们提供静态初始化器呢? 这一限制背后的原因是什么?

  • 问题内容: 这段代码适用于第一个XCode 6 Beta,但在最新的Beta中,它不起作用,并显示以下错误 : 这就是此类的初始化方式: 我坚持下去..最简单的解决方法是什么? 问题答案: 是SKSpriteNode类中唯一指定的初始值设定项,其余都是方便的初始值设定项,因此您不能在它们上调用super。将代码更改为此: 此外,我会将所有这些整合到一个初始化器中。

  • 问题内容: print语句导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经具有默认值(float = 0.0f) ,为什么需要定义一个? 所以这有效 感谢大家! 问题答案: 因为它是一个局部变量。这就是为什么什么都没有分配的原因: 局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访