出现的问题?
当我们写实例化方法时,会出现下面的报错。
一般出现两个报错信息:
super.init' isn't called on all paths before returning from initializer
需要调用父类的init方法
'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'
没有实现父类指定的构造器
正确的写法
class OBView: UIView {
var name = "";
override init(frame: CGRect) {
super.init(frame: frame);
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
为什么会报错?
首先了解一下 required
,在swift中关键字required
required
关键字只能用于修饰类初始化方法。- 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override
- 当子类没有初始化方法时,可以不用实现父类的required初始化方法。
如果父类的初始化方法使用required
修饰时,子类如果重写异于父类的初始化方法,那么必须实现required
修饰的父类的方法。
required
作用就是让子类实现父类指定的构造器
如果子类没有实现任何的init方法,那么默认调用父类的init方法
指定构造器在一个类中必须至少有一个, 而便利构造器的数量没有限制.
convenience
便利构造器:
convenience方法中必须调用self.init(或者其他的指定构造器都可以)来保证非optional的实例变量被赋值初始化。