Swift语言中的init方法是用来创建对象的,有着比较严格的调用方式和实现方式。
初始化方法的顺序
Swift为了保证所有的属性都被初始化,对init方法里语句的顺序有严格的要求。
- 子类要先初始化子类自有的属性
- 调用父类的初始化方法
- 对父类中需要改变的属性再赋值
示例代码:
class Father{
var lastName:String
var firstName:String
init(){
lastName = "wang"
firstName = "Jianlin"
}
}
class Son:Father{
var 任性:Bool
override init(){
任性 = true //初始化子类自有的属性
super.init()//调用super的init
firstName = "Sicong"//更改需要变的成员变量
}
}
init的类别
- Designated
Swift中不加修饰的init都为designated,designated初始化方法中要保证所有非Optional的属性都被初始化,子类的init方法也必须都调用父类的Designated init。 - Convenience
Convenience初始化方法必须调用同类中的Designated init完成初始化,且不能被子类重载也不能在子类中用super的方式调用.只要子类重写了父类convenience初始化方法需要的Designated方法,子类就可以直接调用父类的convenience init完成子类的初始化 - Required
对于希望子类实现的初始化方法,我们可以通过required限制,强制子类重写,这样写的作用保证了依赖某个Designated初始化方法的convenience一直可以使用。另外可以用required修饰convenience方法,用来保证子类不直接使用父类的convenience。
failable init方法
如果一个init方法没有返回一个对象而是返回了nil,说明初始化失败了,这个类型的inti方法叫failable 初始化方法,写作init?。直接在init里return nil
就好了,普通的init方法是不能return nil的,编译会报错。