Swift51.com
麦子学院 头像
麦子学院  2017-01-20 22:31

Swift类的两段式构造详解

回复:0  查看:3338  

本文和大家分享的主要是swift类的两段式构造相关内容,一起来看看吧,希望对大家学习swift有所帮助。

  两段式构造

  第一阶段:

  1. 程序调用子类的某个构造器

  2. 为实例分配内存此时实例的内存还没有被初始化

  3. 指定构造器确保子类定义的所有实例存储属性都已被赋初值

  4. 指定构造器将调用父类的构造器完成父类定义的实例存储属性的初始化

  5. 沿着调用父类构造器的构造器链一直往上执行直到到达构造器链的最顶部

  第二阶段:

  1. 沿着继承树往下构造器此时可以修改实例属性和访问self, 甚至可以调用实例方法

  2.

  最后构造器链中的便利构造器都有机会定制实例和使用self

  3.

  为了使得构造过程更加安全, Swift进行了安全检查

  4.

  安全检查

  · 安全检查 1:指定构造器必须先初始化当前类中定义的实例存储属性然后才能向上调用父类构造器

  · 安全检查 2:指定构造器必须向上调用父类构造器然后才能对继承得到的属性赋值

  · 安全检查 3:便利构造器必须先调用同一个类的其他构造器然后才能对属性赋值

  · 安全检查 4:构造器在第一阶段完成之前不能调用实例方法不能读取实例属性

  class Person {

  var height: Double

  var weight: Double

  // 定义指定构造器

  init(height: Double, weight: Double) {

  self.height = height

  self.weight = weight

  }

  // 定义便利构造器(使用convenience修饰)

  convenience init(h height: Double, w weight: Double) {

  self.init(height: height, weight: weight)

  }

  }

  class ManPerson {

  var sex: String!

  init(sex: String, height: Double, weight: Double) {

  // print(super.height) 不能再父类初始化之前调用父类中的属性

  super.init(height: height, weight: weight)

  super.height = 178

  print(self.height)

  // print(self.sex) 不能在本类中的属性没有进行初始化的时候进行调用

  // 会出现:fatal error: unexpectedly found nil while unwrapping an Optional value错误

  self.sex = sex

  print(self.sex)

  }

  convenience init(s sex: String, h height: Double, weight: Double) {

  // 在调用其他构造器之前不能访问或修改任何实例存储属性

  // print(self.height) 错误

  // super.height = height 错误

  self.init(sex: sex, height: height, weight: weight)

  }

  }

  var man = Man(sex: "", height: 178, weight: 62.0)

 

来源:Cmb Blog