在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()
。