UIViewController
類定義了一個單一指定初始化,init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
和不便利初始化器,但是,它是可能寫入的代碼下面的行,並且具有其編譯(6.1.1的Xcode)UIViewController如何在Swift中設置默認的非參數初始值設定項?
let vc = UIViewController()
這是如何可能?
據雨燕的書,這裏有初始化繼承的規則
規則1如果你的子類沒有定義任何指定的初始化程序,它 自動繼承其所有超類指定初始化的。
規則2如果你的子類,要麼初始化通過繼承他們爲每 規則1提供其所有 超指定的一個實現,或通過提供一個自定義實現其 定義然後,它會自動繼承所有的一部分
摘錄自:蘋果公司「The Swift Programming Language。」iBooks。 https://itun.es/us/jEUH0.l
因此UIViewController
不能繼承其祖先init()
方法超類NSObject
,那麼哪裏初始化從何而來?
在另一個說明中,因爲每個swift類必須最終調用它的指定初始化方法,那麼這是不是意味着initWithCoder:
也最終會調用init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
?但是,實際情況似乎並非如此。
它有一個'initWithCoder:'方法,因爲它符合'NSCoding',它需要它。不知道爲什麼它有一個默認的初始化器...因爲它是一個Objective-C類而不是Swift類,所以不需要遵循Swift繼承的規則,所以它不必調用指定的初始化器。如果你在Swift中重寫它,你可能不得不這樣做。迅速嘗試做的很大一部分是澄清許多這些奧術規則的例外。 – 2015-02-06 18:14:08