gpt4 book ai didi

swift - 为什么基类中的第二个初始化程序会中断编译?

转载 作者:行者123 更新时间:2023-11-28 05:42:21 25 4
gpt4 key购买 nike

给定一个基类、一个派生类和一个带有便利初始化器的扩展,如果将第二个初始化器添加到基类,编译器将抛出错误,如下所示 sscce

#!/usr/bin/env swift 
class A {
required init(a : Int){}
init(b: Int){} // when removing this initializer everything works fine
}

class B: A {
required init(a : Int){ super.init(a: a) }
}

extension A {
convenience init(c : Int) { self.init(a: c) }
}

let b: B = B(c: 1)

使用基类中的两个初始化程序会抛出以下错误:

... error: incorrect argument label in call (have 'c:', expected 'a:')
let b: B = B(c: 1)
^~
a

除了在这种情况下不是很有用的错误消息外,我不太确定这是预期的行为还是 swift 中的错误。

Swift 版本信息:

Apple Swift version 5.0.1 (swiftlang-1001.0.82.4 clang-1001.0.46.5)
Target: x86_64-apple-darwin18.5.0

最佳答案

来自 Automatic Initializer Inheritance :

Assuming that you provide default values for any new properties you introduce in a subclass, the following two rules apply:

Rule 1
If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.

Rule 2
If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.

class A中没有init(b:)class B自动继承init(c:)来自扩展,一切正常。

但是当您将 init(b:) 添加到 class A 时,class B 不再遵循任何一条规则,因此 class B 不再自动从扩展中继承 init(c:)。这会导致错误,因为 class B 现在只有一个 init(a:) 初始化器,没有其他初始化器。

您可以通过重写 class B 中的 init(b:) 来解决这个问题。有了它,class B 再次自动从扩展中获取 init(c:)

关于swift - 为什么基类中的第二个初始化程序会中断编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56174570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com