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}