swift

Swift 类的初始化器

2022-04-19  本文已影响0人  诗颜语

本节主要以class的初始化器讲解,struct 的初始化器与class类似,但不完全相同,而且不会牵扯到继承的问题;

口诀

介绍

分类

使用注意事项

init() {
   // 不允许这样写
    super.init()
}
//所以以下写法可以,但同样‘不建议’这样写 init() 与超类同名了
init() {
     super.init(nibName: nil, bundle: nil)
}
convenience init() {
    self.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
    //一般调用super ,亦可自己实现。此示例是因为`HJViewController`父类遵守了NSCoding协议
    //super.init(coder: coder)
}
  1. 如果自身增加必要初始化器,实现中只能调用父类的指定初始化器。eg: super.init()

作为最终使用的类,在UIViewController中使用的建议

指定初始化器最好只有一个 或者没有
不建议UIViewController的子类重写父类指定初始化器,或自定义指定初始化器,因为这样做必须要实现required init?(coder: NSCoder)此‘必要初始化器
建议使用convenience修饰初始化器:这种初始化器称为便捷初始化器;便捷初始化器内部必须调用一个指定初始化器。
如果非要在初始化时做点什么的话,如果func viewDidLoad()不满足,则只能重写下边这个触发条件中提到的指定初始化器

触发条件

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
   // self.datas = [1] 未调用父类的指定初始化器 此时对象未初始化完成 self不可用
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder: NSCoder) {
    super.init(coder: coder)
}
上一篇 下一篇

猜你喜欢

热点阅读