swift init()默认构造器

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构造器呢?

UIViewController的两个designated构造器

注意到API文档上的一句话才明白,  init()默认构造器已经被override作为convenience构造器,并且内部调用了self.init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)指定构造器

API文档

override方式如下:

很多人可能会有疑问,为什么每次自定义UIViewController的designated构造器,编译器都提示要重载required init?(coder aDecoder: NSCoder)方法

required init?(coder aDecoder: NSCoder)

道理很简单,因为自定了designated构造器,那么你就不能自动的继承和拥有父类的所有designated构造器,同样也包括required init?(coder aDecoder: NSCoder), 该实例化方法也是designated构造器,为什么会多了一个required修饰符,因为这是在NSCoding协议强制要求实现的,UIViewController遵循NSCoding协议,所以该实例化方法必须实现

NSCoding协议

希望上面的两个Tip对刚接触swift的朋友有帮助,如果有疑问可以尽管留言交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。