Swift对象的初始化
2018-08-29 本文已影响2人
lkkwxy
Swift对象的初始化需要保证所有的非可选属性都被初始化。而初始化又分为designated和convenience两种。还有required,required可以和那两种方法进行组合。默认是非required,designated
规则如下:
- designated和convenience都可以有多个实现
- designated初始化方法里必须保证的非可选属性都被初始化.
- 子类的designated初始化方法必须调用父类的designated初始化方法。而且对自己的独有的属性(非继承来的)的赋值语句必须写在调用父类的designated初始化方法之前,如果想更改父类初始化方法中的赋值,则可以在调用父类初始化方法之后,再次进行更改
- convenience初始化方法必须调用自己的designated初始化方法
- extension里不能有designated初始化方法
- 如果子类里有自己的初始化方法,则也必须重写父类required的初始化方法。允许把required designated 重写成designated convenience,当然反过来也可以
- 如果子类里重写了父类required的初始化方法,则不会继承父类其他的初始化方法
针对第6,7两点的例子如下:
class Person {
var name : String
var age :Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
required convenience init(name: String) {
self.init(name: name, age: 18)
}
}
class Student: Person {
var grades: [String] = []
//把父类的required convenience重写成了required designated
required init(name: String) {
super.init(name: name, age: 18)
}
}
//编译不通过 错误信息:Extra argument 'age' in call
//说明没有继承父类其他的初始化方法
let student = Student(name: "lkk", age: 22)