【问题标题】:Why doesn't Swift force my designated initializer to call super?为什么 Swift 不强制我指定的初始化程序调用 super?
【发布时间】:2015-06-14 01:13:52
【问题描述】:

这段代码在 Swift 中是合法的:

class Snapper : NSObject {
    var anim : UIDynamicAnimator
    init(referenceView:UIView) {
        self.anim = UIDynamicAnimator(referenceView:referenceView)
        // super.init()
    }
}

请注意,在我的初始化程序中,我没有调用 super.init();我注释掉了那行。但是 Swift 编译器不会抱怨。为什么?我认为有一条规则,您指定的初始化程序必须调用其超类的指定初始化程序。我有一个超类,即 NSObject。

这是一个错误吗?还是将 NSObject 作为您的超类是一种特殊情况?如果是这样,为什么?我意识到 NSObject 没有需要初始化的实例变量,但是我们怎么知道它的init 没有做其他需要做的事情呢? Swift 不应该在这里给出编译错误吗?

【问题讨论】:

    标签: swift initialization nsobject


    【解决方案1】:

    这不是原因的答案,而是在 [NSObject init] 上添加一个符号断点表明即使 super.init() 被注释掉它也会被调用。

    这绝对是一种特殊情况,因为用任何其他类替换 NSObject 会使编译器再次警告丢失的超级调用。我的猜测是编译器将此作为一种特殊情况处理,因为它是我们的基类,只有一个已知的指定初始化程序。

    【讨论】:

    • 非常有趣。很好的实验,事实上这可能是正确的答案。
    • 我可以从符号断点看出你对幕后发生的事情是正确的。我决定接受这个答案并提交错误报告 (21434444)。秘密的特殊情况不是迅速的方式。规则“你必须调用 super”应该是它所说的意思。谢谢!
    • 我将此作为错误报告提交给 Apple,他们回复说这是故意的。这不是 NSObject 的特例;您可以在任何具有简单init() 的超类中看到相同的现象:如果您不调用任何super.init(...) 方法,则会为您调用super.init()。我认为这是错误的,并重复了我的错误报告,但我不希望 Apple 会同意我的意见。
    • 您是否提交了 openradar 以便我可以提交相同的报告?
    • 我告诉了你我的错误报告编号。随时在您的报告中提及它! (当我说“我重复了我的错误报告”时,我的意思是他们关闭了它,我通过添加进一步的注释来回答他们不应该。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多