构造器调用链的规则
Swift对构造器之间的调用链制定了如下3条规则:
1. 子类构造器必须调用直接父类的指定构造器(如果有父类)
2. 便利构造器必须调用同一个类中得其他构造器
3. 便利构造器调用的构造器链的最终节点必须是制定构造器
简化记忆为:
1. 指定构造器总是向上代理(调用父类构造器)
2. 便利构造器总是必须横向代理(调用当前类的其他构造器)
两段式构造
1、类的构造需要两个阶段:
第一阶段:
1. 程序调用子类的某个构造器;
2. 为实例分配内存,此时实例的内存还没有被初始化;
3. 指定构造器确保子类定义的所有实例存储属性都已经被赋值;
4. 指定构造器将调用父类的构造器,完成父类定义的实例存储属性的初始化
5. 沿着调用父类构造器的构造器链一直往往上执行,直到达到构造器链的最顶部
安全检查
安全检查1:指定构造器必须先初始化当前类中定义的实例存储属性,然后才能向上调用父类构造器
安全检查2:指定构造器必须先向上调用父类构造器,然后才能对继承得到的属性赋值
安全检查3:便利构造器必须先调用同一个类的其他构造器,然后才能进行赋值
安全检查4:构造器在第一阶段完成之前,不能调用实例方法,不能读取实例属性
建议:为实例存储属性指定初始值
扩展的特性
1. 使用扩展添加属性、方法、可变方法、构造器、下标、嵌套类型
2. 可以使一个已有类型符合一个或者多个协议
3. Swift的扩展与Objective-C的类目(category)类似,只是Swift中的扩展没有名字
4. 扩展并不是派生子类,因此不支持重写
扩展可以添加3种属性
1. 类型存储属性
2. 实例计算属性
3. 类型计算属性