在Swift中的NSObject子类初始化器中调用super.init()

15
我正在使用Swift构建iOS应用程序,并参考苹果提供的Lister示例项目。
Lister使用两个模型对象:List和ListItem。我发现,尽管它们是NSObject的子类,但两者的初始化器都没有调用super.init()
然而,在Lister的Objective-C版本中,这两个模型对象(AAPLList和AAPLListItem)都调用了[super init]
《Swift编程语言》明确指出,“指定初始化器必须从其直接超类调用一个指定初始化器。”(初始化中的初始化器链接规则1)
这里发生了什么?为什么这是一个例外情况?如果您不应该在子类中始终调用super.init(),那么哪些规则适用?
1个回答

19
尽管我在文档中找不到描述这一点的地方,但发生的情况是:如果这是超类的唯一初始化程序,并且没有显式调用它,则在子类初始化程序的末尾调用默认超类初始化程序。 NSObject 只有默认初始化程序 (init()); 如果在不调用 super.init(): 的构造函数中尝试引用 self(例如 println(self)),则可以看到在子类初始化程序的末尾调用了超类初始化程序。此时不能这样做,因为该类在此时尚未完全初始化。
如果您想在构造函数中的某个地方使用 self,则需要在那之前手动调用 super.init() 以使对象在此时完全构建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接