swift:实例化之init、required、convenience

出现的问题?

当我们写实例化方法时,会出现下面的报错。

swift:实例化之init、required、convenience_第1张图片

一般出现两个报错信息:

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

  1. required关键字只能用于修饰类初始化方法。
  2. 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override
  3. 当子类没有初始化方法时,可以不用实现父类的required初始化方法。

如果父类的初始化方法使用required修饰时,子类如果重写异于父类的初始化方法,那么必须实现required修饰的父类的方法。

required作用就是让子类实现父类指定的构造器

如果子类没有实现任何的init方法,那么默认调用父类的init方法

指定构造器在一个类中必须至少有一个, 而便利构造器的数量没有限制.

convenience

便利构造器:
convenience方法中必须调用self.init(或者其他的指定构造器都可以)来保证非optional的实例变量被赋值初始化。

你可能感兴趣的:(Swift进阶)