Swift 的初始化
默认初始化
- 类、结构体、枚举都有一个默认的初始化方法,默认的初始化方法不需要参数。
- 初始化方法以关键字
init
命名,并在方法体中进行实例变量的初始化。
枚举的默认初始化
1enum PersonSex {
2 case Male
3 case Female
4 /// 默认初始化方法 声明后才能被调用
5 init() {
6 self = .Female
7 }
8}
结构体的默认初始化
1struct PersonWork {
2 var company: String
3 var job: String
4 var wages: Int
5 /// 默认初始化方法 声明后才能被调用
6 init() {
7 company = ""
8 job = ""
9 wages = 0
10 }
11}
类的默认初始化
1class Person {
2 var name: String
3 var sex: PersonSex
4 var work: PersonWork
5
6 init() {
7 self.name = "name"
8 self.sex = PersonSex()
9 self.work = PersonWork()
10 }
11}
自定义初始化
- 类、结构体、枚举可以有多个自定义初始化方法
- 自定义初始化方法需要有-个或多个参数。
- 子类自定义初始化方法可以调用父类的初始化方法。
- 自定义初始化方法可以访问
self
属性,也可以访问 self
的属性和方法。
- 自定义初始化方法可以返回
self
以便链式调用。
枚举的自定义初始化
1enum PersonSex {
2 case Male
3 case Female
4
5 /// 自定义初始化方法1
6 init(sex: Int) {
7 self = sex == 0 ? .Female : .Male
8 }
9 /// 自定义初始化方法2
10 init(isMale: Bool) {
11 self = isMale ? .Male : .Female
12 }
13}
结构体的自定义初始化
1struct PersonWork {
2 var company: String
3 var job: String
4 var wages: Int
5
6 /// 自定义初始化方法1
7 init(company: String, job: String, wages: Int) {
8 self.company = company
9 self.job = job
10 self.wages = wages
11 }
12 /// 自定义初始化方法2
13 init(company: String, job: String) {
14 self.company = company
15 self.job = job
16 self.wages = 0
17 }
18}
类的自定义初始化
1class Person {
2 var name: String
3 var sex: PersonSex
4 var work: PersonWork
5
6 init(name: String, sex: PersonSex, work: PersonWork) {
7 self.name = name
8 self.sex = sex
9 self.work = work
10 }
11 /// 自定义初始化方法1
12 init(name: String, sex: Int, company: String, job: String, wages: Int) {
13 self.name = name
14 self.sex = PersonSex(sex: sex)
15 self.work = PersonWork(company: company, job: job, wages: wages)
16 }
17 /// 自定义初始化方法2
18 init(name: String, sex: Int, company: String, job: String) {
19 self.name = name
20 self.sex = PersonSex(sex: sex)
21 self.work = PersonWork(company: company, job: job)
22 }
23}
便利初始化
- 便利初始化方法前面需要关键字
convenience
声明。
- 便利初始化方法需要有-个或多个参数。
- 便利初始化方法不能被子类重写。
- 便利初始化方法不能调用父类的初始化方法,但可以调用自身的初始化方法。
- 便利初始化方法可以访问
self
的属性和方法。
- 便利初始化方法不能返回
self
以便链式调用。
类的便利初始化
1class Person {
2 var name: String
3 var sex: PersonSex
4 var work: PersonWork
5
6 init(name: String, sex: PersonSex, work: PersonWork) {
7 self.name = name
8 self.sex = sex
9 self.work = work
10 }
11
12 /// 自定义初始化方法1
13 init(name: String, sex: Int, company: String, job: String, wages: Int) {
14 self.init(name: name, sex: PersonSex(sex: sex), work: PersonWork(company: company, job: job, wages: wages))
15 }
16 /// 自定义初始化方法2
17 init(name: String, sex: Int, company: String, job: String) {
18 self.init(name: name, sex: PersonSex(sex: sex), work: PersonWork(company: company, job: job))
19 }
20
21 /// 便利初始化方法
22 convenience init(name: String) {
23 self.init(name: name, sex: 1, company: "", job: "")
24 }
25
26}