- 类、结构体、枚举都可以定义初始化器
- 类有2种初始化器:指定初始化器(designated)、便捷初始化器(convenience initializer)
- 每个类至少有一个指定初始化器,指定初始化器是累的主要初始化器
- 默认初始化器总是类的指定初始化器
- 类偏向于少量指定初始化器,一个类通常只有一个指定初始化器
- 初始化器的相互调用规则
- 指定初始化器必须从它的直系父类调用指定初始化器
- 便捷初始化器必须从相同的类里调用另一个初始化器
- 便捷初始化器最终必须调用一个指定初始化器
required
print("required")
class Person {
var name: String
var age: Int
required init(name: String,age: Int) {
self.name = name
self.age = age
}
}
var person = Person(name: "wpp", age: 27)
print(person.name,person.age)
class Student: Person {
required init(name: String, age: Int) {
super.init(name: name, age: age)
}
}
- 用required修饰指定初始化器,表面其所有子类都必须实现该初始化器(通过继承或重写实现)
- 如果子类重写了required初始化器,也必须加上required不用加override
属性观察器
class Person {
var age: Int {
willSet {
print("willSet",newValue)
}
didSet {
print("didSet",oldValue,age)
}
}
init() {
age = 0
}
}
class Student: Person {
override init() {
super.init()
self.age = 1
}
}
let stu = Student()
print(stu)
- 父类的属性在它自己的初始化器种赋值不会触发属性观察期,但是在子类初始化器种赋值会触发属性观察期
网友评论