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

sdd*_*sma 14 subclass nsobject subclassing ios swift

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

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

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

斯威夫特编程语言中明确指出,"指定的初始化程序必须调用从他们的直接超类的指定初始化方法."(初始化程序链接在初始化的第1条)

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

jas*_*mer 17

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

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

如果要在构造函数中的某处使用self,则需要在该点完全构造对象,因此需要在此super.init()之前手动调用.