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