美文网首页
Swift中的init

Swift中的init

作者: 成都老刘 | 来源:发表于2019-06-26 21:01 被阅读0次

    前言

    最近总算开始做新项目, 语言肯定的选Swift了。问题一个接一个,不过还好,来一个解决一个。
    今天遇到了Swift中的init的问题, 用Xcode也没有自动补全,也没有看到相关init的东西,所以对init构造过程进行一个分析。

    两个类

    有一个Parent的Class

    class Parent: NSObject {
        override init() {
            NSLog("Parent Init")
        }
    }
    

    有一个Child的Class继承于Parent

    class Child: Parent {
        override init() {
            NSLog("Child Init")
        }
    }
    

    调用代码

    在其他的某个类中,初始化一个Child对象出来,

    func doSomething() {
        Child()
    }
    

    由于Xcode没有默认添加super.init(),所以这里到底是怎样一个逻辑过程?
    按照我对其他语言的理解,我猜测是有两种可能情况:

    1. 只会输出Child Init
    2. 先输出Parent Init,然后输出Child Init"

    运行代码

    代码的运行情况出乎我的意料

    输出结果是:

    Child Init
    Parent Init
    

    居然先输出Child Init。

    也就是说先调用了子类的init(), 然后再调用父类的init()。

    结论

    Swift中的init过程,子类如果没有调用super.init(),那么会在子类的init()的末尾隐式添加super.init()

    我们该如何处理?

    一般情况,我们需要在子类的init()中,应该显式地、尽快地调用super.init()

    如上面的Child类就该写成

    class Child: Parent {
        override init() {
            super.init() // 显式的添加super.init()到第一行
            NSLog("Child Init")
        }
    }
    

    相关文章

      网友评论

          本文标题:Swift中的init

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