swift:实例化之init、required、convenience

出现的问题?

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

png1

一般出现两个报错信息:

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的实例变量被赋值初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值