Swift文档Chapter 14 构造过程
构造过程是使用类,结构体或者枚举前的准备过程。
存储属性的初始赋值
类和结构体创建实例后必须给所有的存储属性赋合适的初值,不能处于一个未知状态。
可以在构造器中为属性设置初始值或者在定义属性的时候分配默认值。这种情况下,值是被直接设置,不会触发任何属性观察器。
构造器
构造器以init()
定义,构造器中可以为属性赋初值。
默认属性值
可以在属性声明中直接赋初值,这比在init()
中赋一个一样的值要好。
自定义构造过程
形参的构造过程
自定义构造器可以提供形参。语法和函数,方法相同。形参依靠参数标签和参数名区分,不靠类型区分。
形参命名和实参标签
跟函数和方法形参相同,构造形参可以同时使用在构造器里使用的形参命名和一个外部调用构造器时使用的实参标签。
然而,构造器并不像函数和方法那样在括号前有一个可辨别的方法名。因此在调用构造器时,主要通过构造器中形参命名和类型来确定应该被调用的构造器。正因如此,如果你在定义构造器时没有提供实参标签,Swift会为构造器的每个形参自动生成一个实参标签。
如果不通过实参标签传值,这个构造器是没法调用的。如果构造器定义了某个实参标签,就必须使用它,忽略它将导致编译期错误。
不带实参标签的构造器形参
如果你不希望构造器的某个形参使用实参标签,可以使用下划线(_
)来代替显式的实参标签来重写默认行为。这样就可以不写标签来调用。
可选属性类型
可选类型可以为nil
,会默认赋值为nil
。可以不在构造器或使用默认参数初始化。
构造过程中常量属性的赋值
你可以在构造过程中的任意时间点给常量属性赋值,只要在构造过程结束时它设置成确定的值。一旦常量属性被赋值,它将永远不可更改。对于类的实例来说,它的常量属性只能在定义它的类的构造过程中修改;不能在子类中修改。
默认构造器
如果结构体或类为所有属性提供了默认值,又没有提供任何自定义的构造器,那么 Swift 会给这些结构体或类提供一个默认构造器。这个默认构造器将简单地创建一个所有属性值都设置为它们默认值的实例。
结构体的逐一成员构造器
结构体如果没有定义任何自定义构造器,它们将自动获得一个逐一成员构造器。不像默认构造器,即使存储型属性没有默认值,结构体也能会获得逐一成员构造器。
值类型的构造器代理
构造器在可以调用其他构造器完成实例的部分构造过程,称为构造器代理。值类型和引用类型的构造器代理方法不同。值类型不支持继承,构造器代理比较简单。
值类型可以使用self.init()
来调用自己的构造函数。只能在构造函数中调用自己的构造函数。如果我们为某个值定义了构造器,那么值类型的默认构造器不可以使用,必须要显式的声明。
类的继承和构造过程
类的所有属性,包括父类的存储型属性都必须在构造过程中赋值。Swift提供两种构造器保证所有的属性都可以得到初值。
指定构造器和便利构造器
指定构造器是类中的主要构造器,初始化类中的所有属性并调用合适的父类构造器让构造过程沿着父类链向上进行。
一个类至少拥有一个指定构造器。许多类通过继承父类的指定构造器满足条件。
便利构造器是类中比较次要的、辅助型的构造器。你可以定义便利构造器来调用同一个类中的指定构造器,并为部分形参提供默认值。你也可以定义便利构造器来创建一个特殊用途或特定输入值的实例。
指定构造器和便利构造器的语法
init(parameters) {
statements
}
convenience init(parameters) {
statements
}
类的构造器代理
满足三条规则:
- 指定构造器必须调用其直接父类的的指定构造器;
- 便利构造器必须调用同类中定义的其它构造器;
- 便利构造器最后必须调用指定构造器。
也就是说:指定构造器必须总是向上代理,便利构造器必须总是横向代理。