Swift中的init

前言

最近总算开始做新项目, 语言肯定的选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)