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的朋友有帮助,如果有疑问可以尽管留言交流