Swift 从零开始 13_自定义init方法

自定义init初始化构造函数实现参数传递

对于UIKit框架类,不能像下面一样简单的重写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import UIKit
class WebViewController: UIViewController {
var imageUrl: String!
init(imageUrl: String) {
self.imageUrl = imageUrl
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
}
}
这样编译器会报如下错误:
1
Super.init isn‘t called before returning from initializer
原因分析:

1.在 Swift 中, 类的初始化器有两种, 分别是Designated Initializer(指定初始化器)和Convenience Initializer(便利初始化器)

2.如果子类没有定义任何的指定初始化器, 那么会默认继承所有来自父类的指定初始化器。

3.如果子类提供了所有父类指定初始化器的实现, 那么自动继承父类的便利初始化器

4.如果子类只实现部分父类初始化器,那么父类其他的指定初始化器和便利初始化器都不会继承。

5.子类的指定初始化器必须要调用父类合适的指定初始化器。

错误分析:
指定构造器必须调用它最近父类的指定构造器。

正确写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import UIKit
class WebViewController: UIViewController {
var imageUrl: String!
init(imageUrl: String) {
super.init(nibName: nil, bundle: nil)
self.imageUrl = imageUrl
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
}
}