我正在Swift中构建一个iOS应用程序并使用Apple提供的Lister示例项目。
Lister使用两个模型对象:List和ListItem。我发现他们两个都没有在他们的初始值设定项中调用super.init()
,即使它们是NSObject的子类。
但是,在Lister的Objective-C版本中,两个模型对象(AAPLList和AAPLListItem)都会调用[super init]
。
Swift编程语言明确指出“指定的初始值设定项必须从其直接超类中调用指定的初始值设定项。”(初始化中的初始化程序链接规则1)
这里发生了什么?为什么这是一个例外,如果你不应该总是调用子类中的super.init(),那么适用哪些规则?
答案 0 :(得分:15)
即使我在文档中找不到描述这个位置的地方,但是如果那是超类的唯一初始化,那么在子类初始化器的末尾会调用默认的超类初始化器,并且它没有被明确调用。
NSObject
只有默认的初始值(init());
,您可以看到通过尝试引用self(例如构造函数中的println(self))
)在子类初始化器的末尾调用超类初始化器不调用super.init():
你不允许这样做,因为该类在那时没有完全初始化。
如果你想在构造函数中的某个地方使用self,那么对象需要在那时完全构造,所以你需要在那之前手动调用super.init()
。