[英]Calling super.init() in initializer of NSObject subclass in Swift
我正在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()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.