©️ OverlookArt
首页 / Swift / Swift 的初始化

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}