首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方便Init覆盖

方便Init覆盖
EN

Stack Overflow用户
提问于 2014-08-15 06:59:18
回答 1查看 12.9K关注 0票数 19

问题

Override是子类的方便的初始化器,它会产生编译错误。

细节

我很难理解Swift (v4.1)为什么不让我覆盖我的方便初始化器。阅读这些文档,我发现这两条规则适用于我的问题:

如果您的子类没有定义任何指定的初始化器,则它会自动继承其所有超类指定的初始化器。 如果您的子类提供了其所有超类指定初始化器的实现--或者按照规则1继承它们,或者提供自定义实现作为其定义的一部分--那么它将自动继承所有超类方便初始化器。

在下面的代码中,我属于第一条规则,所有方便的初始化器都继承到ClassB中。此外,由于我继承了第一条规则中指定的所有初始化器,所以我还继承了所有方便的初始化器。

代码语言:javascript
复制
class ClassA<T> {

    // This array would be private and not visible from ClassB
    var array: [T]?

    init() { }

    convenience init(array: [T]) {
        self.init()

        self.array = array
    }
}

class ClassB<T>: ClassA<T> {

    var anotherArray: [T]?

    // I feel like I should include the "override" keyword
    // but I get a compiler error when "override" is added before "convenience init".
    convenience init(array: [T]) {
        self.init()

        self.anotherArray = array
    }
}

// Works fine
let instanceA = ClassA(array: [1, 2])
// Compile error when override is added:
// error: Initializer does not override a designated initializer from its superclass
// note: attempt to override convenience initializer here
//     convenience init(array: [T]) {
//                 ^
let instanceB = ClassB(array: [1, 2])

但是我不明白的是:ClassB有一个稍微不同的init(array:)实现,我想重写这个方便的初始化器。使用override关键字会产生编译错误。我是否错误地理解了这些初始化概念?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-15 07:39:29

是不必要的

相反,如果编写与超类方便初始化器匹配的子类初始化程序,则子类永远无法直接调用该超类便利性初始化器,这与上面在初始化器链接中描述的规则相同。因此,您的子类没有(严格地说)提供超类初始化器的覆盖。因此,在提供超类方便初始化器的匹配实现时,您不会编写override修饰符。

但正如所写的,它似乎应该能工作-据我所知,这是一个编译器的错误。如果您将array参数的名称更改为ClassB的初始化程序(例如array2 ),则它将按预期工作。你应该归档雷达

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25322421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档