所谓构造过程是指在创建某个实例而进行的一系列准备过程。比如为实例中的属性设置初始值和执行其他初始化工作。
构造过程是通过构造器来实现的,其实每个构造器就可以看作是一个函数,只是这个函数是为了执行初始化的。
1、存储属性的初始赋值
以类和结构体的实例创建为例,在创建类和结构体实例的时候,需要给类和街头题的属性设置一个默认值,有两种方法:
1⃣️在定义属性的时候设置默认值;2⃣️在构造器中赋初值
无论是哪一种方法,他们的值都是被直接设置的,不会触发任何的属性观察器。
那么什么是构造器呢?其实在上面的类的继承中我们已经见过,就是以关键字init命名的实例方法:
struct Rect { var width : Double init(){ width = 10.0 } }
2、定制化构造过程
刚刚我们使用的是默认构造函数,如果我们需要在创建实例的时候用到一些自己输入的参数什么的,这个时候我们就需要用到定制化构造过程。
其实定制化的构造过程无非就是将刚刚的无参构造函数变成含参构造函数,其他的不变。
比如看下面的例子:
struct Rect { var width : Double var height : Double = 10.0 init(Square square : Double){ width = square } init(Rectangle rectangle : Double){ width = rectangle } func description (){ println("width is \(width)") } } var graph : Rect = Rect(Square: 10) var graph2 = Rect(Rectangle: 20) graph.description() graph2.description()
这个例子中我们提供了2个构造函数,一个用来创建正方形,一个用来创建长方形,呵呵,显得有些多余。。。。
我们在创建实例的时候就可以调用不同的构造函数来完成不同的操作。
3、默认构造器
swift将为所有属性已提供默认值的且自身没有定义任何构造器的结构体或基类,提供一个默认的构造器,这个默认构造器将简单的创建一个所有属性值都设置为默认值的实例。
比如下面:
struct Rect { var width : Double = 10.0 var height : Double = 10.0 } var graph : Rect = Rect()
这个Rect就没有构造器,系统会提供一个默认构造器。
除了上面提到的默认构造器,系统还可以用逐一成员构造器来初始化新实例里成员属性的快捷方法。请参考结构体部分。
4、构造器代理
所谓构造器代理就是构造器可以通过调用其他构造器来完成实例的部分构造过程,能够减少多个构造器之间的代码重复。
由于值类型(结构体和枚举)不支持继承,所以构造器代理的过程相对简单,因为他们只能代理任务给自身提供的其他构造器。类则不一样,它可以继承自其他类,这就是说类哟保证其他所有继承的属性在构造时能正确的初始化。
struct Rect { var width : Double = 10.0 var height : Double = 10.0 init (){ } init (h : Double){ self.height = h println("h is \(h)") } init (printH : Double){ self.init(h : printH) } } var graph : Rect = Rect(printH: 3.2) var graph2 = Rect(h: 4.3)
该结构体提供了3个构造函数,一个是空的init,不执行任何操作,一个是传入h,打印出h的值,一个是传入pirintH,然后调用init (h : Double)这个构造函数,打印出我输入的值。
5、类的继承和构造过程
类中的所有属性包括继承自父类的属性,都必须在构造过程中设置初始值。
类中的构造器有两种,一个是指定构造器,一个是便利构造器,他们都能确保所有类实例中存储属性都能获得初始值。
指定构造器是类中的最主要的构造器,一个指定构造器将初始化类中提供的所有属性,并根据父类链往上调用父类的构造器来实现父类的初始化。每个类都必须拥有一个指定构造器。
便利构造器是辅助构造器,我们可以定义一个便利构造器来调用同一个类中的指定构造器,并为其提供参数和默认值。
下次继续。