Swift 是类型安全的语言,有超级严格的初始化方法
不加修饰的 init 方法都需要在方法中保证所有非 Optional 的实例变量被初始化,而在子类中也强制(显式货隐式的)调用了 super 的 designated 指定的初始化。
// 这里非 Optional 的变量在外面有自己的默认值的时候,初始化方法可以不用给他们初始化
// 不加修饰的初始化方法 init 默认是 designated 指定的
与 designated 初始化方法对应的是在 init 前面加上 convenience 关键字的初始化方法
是 swift 初始化方法的 ‘二等公民’, 只作为补充和提供使用上的方便
注意: 所有的 convenience 初始化方法都必须调用同一个类中的 designated 初始化方法来完成设置。
另外,convenience 初始化方法是不能被子类重写或者从子类中以 super 的方式被调用的
class ClassA {
let numA:Int
//如果这里加上了required关键字,表明子类必须也要加上required,但是去掉
override init(num:Int) {
numA= num
}
convenience init(bigNumber:Bool){
self.init(num: bigNumber ?10000:1)
}
}
class ClassB :ClassA{
let numB:Int
override init(num:Int){//重写了父类的的designated初始化方法
numB= num +1
super.init(num: num)
}
}
let anObj =ClassB(bigNumber:true)//这里调用的是父类的convenience初始化方法
print(anObj.numA)//
print(anObj.numB)//父类中的初始化方法被重
网友评论