美文网首页
对 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