前言
最近总算开始做新项目, 语言肯定的选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(),所以这里到底是怎样一个逻辑过程?
按照我对其他语言的理解,我猜测是有两种可能情况:
- 只会输出Child Init
- 先输出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")
}
}
网友评论