在 Swift 中,为保证安全性,init 方法只能调用一次,且在 init 完成后,保证所有非 Optional 的属性都已经被初始化。
每个类都有指定的初始化方法:designated initializer,这些初始化方法是子类必须调用的,为的就是保证父类的属性都初始化完成了。
而如果不想实现父类的 designated initializer,可以添加 convenience 关键字,自己实现初始化逻辑。
convenience 初始化不能调用父类的初始化方法,只能调用同一个类中的 designated initializer。
由于 convenience 初始化不安全,所以 Swift 不允许 convenience initializer 被子类重写,限制其作用范围。
举例:
如果想要重写 UIViewContoller 的初始化方法,这样写是不行的:
init(type: CustomType) {
super.init()
self.type = type
}
这是因为没有调用 designated initializer,而 UIViewController 的 designated initializer 是:
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
所以想要实现自定义的初始化方法,要么调用 designated initializer:
init(type: CustomType) {
self.type = type // 在初始化之前给 let 属性赋值完成初始化
super.init(nibName: nil, bundle: nil)
}
要么使用 convenience 关键字,调用自己的 designated initializer:
init() {
super.init(nibName: nil, bundle: nil)
}
convenience init(type: CustomType) {
self.init(type: type)
}
网友评论