
对象类型
|
151
可以在类声明前加上关键字
final
防止类被继承,也可以在类成员声明前加上关键字
final
防止它被子类重写。
4.4.3
类初始化器
类实例的初始化要比结构体或枚举实例的初始化复杂得多,这是因为类存在继承。初始
化器的主要工作是确保所有属性都有初值,这样当实例创建出来后其格式就是良好的;
初始化器还可以做一些对于实例的初始状态与完整性来说是必不可少的工作。不过,类
可能会有父类,也有可能拥有自己的属性与初始化器。这样,除了初始化子类自身的属
性并执行初始化器任务,我们必须要确保在初始化子类时,父类的属性也被初始化了,
并且初始化器会按照良好的顺序执行。
Swift
以一种一致、可靠且巧妙的方式解决了这个问题,它强制施加了一些清晰且定义良
好的规则,用于指导类初始化器要做的事情。
1.
类初始化器分类
这些规则首先对类可以拥有的初始化器种类进行了区分:
隐式初始化器
类没有存储属性,或是存储属性都作为声明的一部分进行初始化,没有显式初始化器,
有一个隐式初始化器
init()
。
指定初始化器
在默认情况下,类初始化器是个指定初始化器。如果类中有存储属性没有在声明中
完成初始化,那么这个类至少要有一个指定初始化器,当类被实例化时,一定会有
一个指定初始化器被调用,并且要确保所有存储属性都被初始化。指定初始化器不
可以委托给相同类的其他初始化器;指定初始化器不能使用
self.init(...)
。
便捷初始化器
便捷初始化器使用关键字
convenience
标记。它是个委托初始化器,必须调用
self.init(...) ...