swift構造器的重載繼承規則官方文檔寫的很清楚,這里分享一些關于init()默認構造器的理解,還有特別是UIViewController和UIView兩個類中init()構造器的變化。
根據swift官方文檔The default initializer (when available) is always a designated initializer for a class,也就是說默認構造器init()是designated(指定構造器)
那么我的問題就是(如下截圖),UIViewController的init()方法不是desginated構造器,UIView也是一樣的問題,為什么會這樣?
首先我們需要明確一點的是,在自定義了類的designated構造器后,默認構造器init()就會無法使用,以下引用swift官方文檔
Note that if you define a custom initializer for a value type, you will no longer have access to the default initializer (or the memberwise initializer, if it is a structure) for that type.
所以既然UIViewController有2個自定義designated構造器了,那么按道理init()默認構造器就應該失效了,那么唯一可能是override的了,那么為什么不是designated構造器呢?
注意到API文檔上的一句話才明白, ?init()默認構造器已經被override作為convenience構造器,并且內部調用了self.init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)指定構造器
override方式如下:
很多人可能會有疑問,為什么每次自定義UIViewController的designated構造器,編譯器都提示要重載required init?(coder aDecoder: NSCoder)方法
道理很簡單,因為自定了designated構造器,那么你就不能自動的繼承和擁有父類的所有designated構造器,同樣也包括required init?(coder aDecoder: NSCoder), 該實例化方法也是designated構造器,為什么會多了一個required修飾符,因為這是在NSCoding協議強制要求實現的,UIViewController遵循NSCoding協議,所以該實例化方法必須實現
希望上面的兩個Tip對剛接觸swift的朋友有幫助,如果有疑問可以盡管留言交流