繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM