此代码在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不应该在这里给出编译错误吗?
答案 0 :(得分:3)
这不是原因的答案,但在[NSObject init]
上添加符号断点表明,即使super.init()
已被注释,它也会被调用。
这绝对是一种特殊情况,因为用任何其他类替换NSObject
会使编译器再次警告缺少的超级调用。我的猜测是编译器将其作为特殊情况处理,因为它是我们的基类,只有一个已知的指定初始化器。