关于Designated, Convenience 和 Required 区别

来源:互联网 发布:网易云音乐 知乎 编辑:程序博客网 时间:2024/05/22 17:21

关于Designated, Convenience 和 Required 区别
1.Designated (指定的)
顾名思义 在本文章中指的就是“Designated初始化方法”
在OC中,Init方法是非常不安全的,因为不能确保init只被调用一次,同时也不能确保init初始化方法调用后,实例内的每个变量都已经完成初始化。 因此在 Swift里对初始化方法加强了规范,确保每个实例初始化后,其内部的成员变量都已经完成初始化。
期间笔者还遇到一个小问题,let类型作为一个不变量 是不能被赋值的(这是对于构建线程安全的API很有用)。而在init方法里是可以进行赋值的,后来翻阅资料了解到,Swift的init方法只能被调用一次,所以在init方法中才可以赋值,而不会引起任何线程安全的问题。

2.Convenience (便利)
Convenience这类方法是Swift初始化方法中的“二等公民”相当于只要父类里面存在,我们就可以在子类中就可以使用。但是需要注意到的是Convenience的初始化方法是不能被子类重写或从子类中以super的方式调用。相当于子类不需要重写父类的这个初始化方法就可以使用
/示例/
class People {

var name: Stringinit() {    name = "qq"}convenience init(number: Int) {    self.init()    name = String(number)}

}

class TempPeople: People {

let page: Intoverride init() {    page = 10}

}

/没有重写调用/
let model = TempPeople(number: 5)

3.Required (必需的)
如果你有一个父类的方法 必需强制要求所有子类重写,那就用到了Required。
/示例/

class People {

var name: String

required init() {

    name = "qq"}convenience init(number: Int) {    self.init()    name = String(number)}

}

class TempPeople: People {

let page: Intrequired init() {    page = 10}

}

这里的 TempPeople子类就必需要实现父类的init()方法

0 0
原创粉丝点击