constructor - Swift:使用指定的初始化程序覆盖便利

标签 constructor initialization swift overriding

Swift 文档说明如下:

If the initializer you are overriding is a convenience initializer, your override must call another designated initializer from its own subclass, as per the rules described above in Initializer Chaining.

这意味着,当我从基类定义一个与 convenience 初始化器具有相同签名的初始化器时,它也必须充当 convenience 初始化器。我不能用 designated 初始值设定项“覆盖” convenience 初始值设定项。

这对我来说似乎很尴尬:可能有多种情况,其中签名,例如 (String) 只是基类的便利初始化,但是子类的指定初始化。与方法相反,仅仅因为两个初始化器具有相同的签名,它们不必执行相似的任务。 (String) 的签名对于子类可能意味着完全不同的东西。

  1. 那么,他们为什么要添加此限制?
  2. 我该如何规避它?也就是说,如果我确实需要一个与基类中的便利初始化程序具有相同签名的非便利初始化程序,我应该怎么做?我唯一的猜测是添加一个未使用的虚拟参数只是为了区分它们。但这看起来很老套

最佳答案

他们的意思是,如果您在之后覆盖的初始化器是一个方便的初始化器,那么您必须遵循初始化器链。

以下工作正常意味着您可以使用指定的初始化器覆盖便利初始化器:

class Base {
    var x = 0
    init() {}
    convenience init(_: Int) {
        self.init()
        self.x = 5
    }
}

class Derived : Base {
    init() {}
    init(_: Int) {
        super.init()
        self.x = 10
    }
}

var i = Derived(1)     // x = 10

关于constructor - Swift:使用指定的初始化程序覆盖便利,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712047/

相关文章:

c++ - 如何从另一个文件调用类构造函数?

c++ - C++中的构造函数调用

c# - Spring.Net 中的多个上下文

swift - 为什么当我使用 CASSpringAnimation 时我的图像没有动画?

c++ - 如何使右值方法正确调用 move 构造函数

constructor - Lua中这两段代码有什么区别

c++ - 带大括号的结构初始化/赋值

json - Swift 使用参数初始化类,然后在不使用参数的情况下初始化它

swift - 从 iOS 10.3 开始,discoverAllIdentities 和 discoverUserIdentity 为 CKUserIdentity.lookupInfo 返回 nil

ios - GameScene SpriteKit 不适合 iPhone X 显示