美文网首页
对 Swift 中初始化和 convenience 关键字的学习

对 Swift 中初始化和 convenience 关键字的学习

作者: FinLaas | 来源:发表于2019-08-08 12:36 被阅读0次



在 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)
}



学习来源:DESIGNATED,CONVENIENCE 和 REQUIRED

相关文章

网友评论

      本文标题:对 Swift 中初始化和 convenience 关键字的学习

      本文链接:https://www.haomeiwen.com/subject/mltxjctx.html