构造过程
当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性管擦起。
自定义构造过程
你可以通过输入参数和可选属性类型来自定义构造过程,也可以在构造过程中修改常量属性。这些都将在后面章节中提到。
构造参数
自定义 构造过程 时,可以在定义中提供构造参数,指定所需值的类型和名字。构造参数的功能和语法跟函数和方 法的参数相同。
构造过程中常量属性的修改
你可以在构造过程中的任意时间点修改常量属性的值,只要在构造过程结束时是一个确定的值。一旦常量属性被赋值,它将永远不可更改。
对于类的实例来说,它的常量属性只能在定义它的类的构造过程中修改;不能在子类中修改。
默认构造器
如果结构体和类的所有属性都有默认值,同时没有自定义的构造器,那么 Swift 会给这些结构体和类创建一个默 认构造器。这个默认构造器将简单的创建一个所有属性值都设置为默认值的实例。
结构体的逐一成员构造器
除上面提到的默认构造器,如果结构体对所有存储型属性提供了默认值且自身没有提供定制的构造器,它们能自动获得一个逐一成员构造器。
值类型的构造器代理
构造器可以通过调用其它构造器来完成实例的部分构造过程。这一过程称为构造器代理,它能减少多个构造器间
的代码重复。
指定构造器和便利构造器
指定构造器是类中最主要的构造器。一个指定构造器将初始化类中提供的所有属性,并根据父类链往上调用父类的构造器来实现父类的初始化。
类的指定构造器的写法跟值类型简单构造器一样:
init(parameters) {
statements
}
便利构造器也采用相同样式的写法,但需要在 init 关键字之前放置 convenience 关键字,并使用空格将它们俩分 开:
convenience init(parameters) {
statements
}
指定构造器必须总是向上代理
便利构造器必须总是横向代理
两段式构造过程
Swift 中类的构造过程包含两个阶段。第一个阶段,每个存储型属性通过引入它们的类的构造器来设置初始 值。当每一个存储型属性值被确定后,第二阶段开始,它给每个类一次机会在新实例准备使用之前进一步定制它 们的存储型属性。
两段式构造过程的使用让构造过程更安全,同时在整个类层级结构中给予了每个类完全的灵活性。两段式构造过
程可以防止属性值在初始化之前被访问;也可以防止属性被另外一个构造器意外地赋予不同的值。
注意:Swift的两段式构造过程跟 Objective-C 中的构造过程类似。最主要的区别在于阶段 1,Objective-C 给每一个 属性赋值 0 或空值(比如说 0 或 nil )。Swift 的构造流程则更加灵活,它允许你设置定制的初始值,并自如 应对某些属性不能以 0 或 nil 作为合法默认值的情况。
析构过程
析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字 deinit 来标示,类 似于构造器要用 init 来标示。
析构过程原理
Swift 会自动释放不再需要的实例以释放资源
在类的定义中,每个类最多只能有一个析构器,而且析构器不带任何参数,如下所示:
deinit {// 执行析构过程
}