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