相比较Objective-C而言,Swift的init初始化方法有三种Designated,Convenience和Required三种形式.类初始化有三个规则:
①指定的初始化方法必须从其直接父类调用一个指定的初始化方法.
②便利构造方法必须调用同一类中定义的其他初始化方法.
③便利构造方法必须最终会调用指定的初始化器.
定义Teacher类:
<pre><code>`import UIKit
class Teacher {
var name:String = ""
init(name:String) {
self.name = name
}
convenience init() {
self.init(name: "Teacher")
}
}`</code></pre>
Student子类实现:
<pre><code>`class Student: Teacher {
var score:String = ""
// 指定构造方法
init(name: String,score: String) {
self.score = score
super.init(name: name)
}
// 便利构造方法调用指定初始化方法
convenience override init(name: String) {
self.init(name:"",score:"")
}
}`</code></pre>
Swift中的类初始化分为两个阶段:
①每一个存储属性都由引入它的类分配一个初始值,确定了每个存储属性的初始状态.
②每个类中实例准备返回之前,进一步更新其存储的属性.
两阶段初始化过程使初始化变得安全,同时也给类层次结构中的每个类提供了完全的灵活性。两阶段初始化防止属性值在初始化前被访问,并防止属性值被另一初始化器设置为不同的值。
Swift编译过程会进行安全检查:
①指定构造器必须要确保所有被类中提到的属性在向上调用父类的指定构造器前被初始化,之后才能将其他构造任务移交给父类的中的构造器.
②指定构造器必须先向上调用父类中的构造器,才能为继承自父类的属性赋值.
③便利构造器必须线调用同一个类中的其他构造器,再为属性赋值.
④构造器完成之前不能调用其他任何实例方法,不能读取实例属性的值.
对于子类中一定实现的 designated 初始化方法,可以通过required 关键字进行限制,强制子类重写实现.
<pre><code>`class Teacher {
var name:String = ""
required init(name:String) {
//self.name = name
}
convenience init() {
self.init(name: "Teacher")
}
}`</code></pre>
<pre><code>`class Student: Teacher {
var score:String = ""
// 指定构造方法
init(name: String,score: String) {
self.score = ""
super.init(name: name)
}
required init(name: String) {
super.init(name: name)
}
}`</code></pre>
参考资料
Apple官方文档