Swift 中类的两段式构造

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift 中类的两段式构造相关的知识,希望对你有一定的参考价值。

本文和大家分享的主要是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

以上是关于Swift 中类的两段式构造的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中类的构造函数理解

Java中类的构造方法

java中类的构造方法

Swift中类和结构体

java中类的构造方法和普通的方法在使用上有啥区别?

最全面的c++中类的构造函数高级使用方法及禁忌