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

我正在Swift中构建一个iOS应用程序,并利用Apple提供的Lister示例项目。

Lister使用两个模型对象:List和ListItem。 我发现它们都没有在初始化器中调用super.init() ,即使它们是NSObject的子类。

但是,在Lister的Objective-C版本中,两个模型对象(AAPLList和AAPLListItem)都调用[super init]

Swift编程语言明确指出“指定的初始化程序必须从它们的直接超类中调用指定的初始化程序。”(初始化程序中的初始化程序链接规则1)

这里发生了什么? 为什么这是一个例外,如果你不应该总是在子类中调用super.init(),那么适用哪些规则?

即使我在文档中找不到描述这个位置的地方,但是如果那是超类的唯一初始化,那么默认的超类初始化器在子类初始化器的末尾被调用,并且它没有被调用明确。

NSObject只有默认的初始化程序(init()); 通过尝试在不调用super.init():的构造函数中引用self(例如println(self)) ,可以看到超类初始化器在子类初始化器的末尾被调用super.init():您不允许这样做,因为那个阶段没有完全初始化。

如果你想在构造函数中的某个地方使用self,那么对象需要在那个时候完全构造,所以你需要在那之前手动调用super.init()