关于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: String
init() {
name = "qq"
}
convenience init(number: Int) {
self.init()
name = String(number)
}
}
class TempPeople: People {
let page: Int
override 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: Int
required init() {
page = 10
}
}
这里的 TempPeople子类就必需要实现父类的init()方法