我有一个类(比如Foo
),它有两个初始值设定项,其中一个是指定的,另一个是convenience init
。他们看起来像这样:
public class Foo {
init(object: SomeObject) {
self.object = object
// Do something with object…
}
public convenience init() {
self.init(object: SomeObject())
}
}
Bar
是Foo
的子类,并且在调用SomeObject()
指定的初始化程序之前更专业地配置Foo
实例
public class Bar {
public convenience init(arg: Arg) {
let object = SomeObject(arg: arg)
// Configure object…
self.init(object: object)
}
}
不幸的是,由于Bar
符合Automatic Initializer Inheritance所需的所有条件,因此它还会继承Foo
的{{1}}初始化程序,它不会指望任何参数。这对convenience
没有意义,因为我前面提到的特殊行为发生在Bar
方法中。
有没有办法禁用自动初始化程序继承?如果没有,是否可以将继承的convenience init
更改为convenience init
?如果这些都不可能,我也愿意重新思考类结构并以另一种方式进行。在这种情况下,如果需要,我还可以提供更多详细信息(例如private
和Foo
)。
答案 0 :(得分:0)
我想出了如何修复它 - 解决方案是简单地从convenience
的初始化程序中删除Bar
关键字。由于这违反了自动继承的第一条规则,Bar
不再继承Foo
的便利init,但仍然可以调用Foo
指定的init通过super.init(object: object)
。