构造过程
构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例使用前需要设置实例中每个存储属性的初始值和执行其他必须的设置。
你要通过定义构造器来实现构造过程,与 Objective-C 中的构造器不同,Swift 的构造器没有返回值。构造器的主要任务是保证新实例在第一次使用前完成正确的初始化。
(构造过程就是初始化过程,构造器就是OC中的init方法)
存储属性的初始赋值
类和结构体在创建实例时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。
你可以在构造器中为存储型属性设置初始值,也可以在定义属性时分配默认值。以下小节将详细介绍这两种方法。
注意
当你为存储型属性分配默认值或者在构造器中设置初始值时,它们的值是被直接设置的,不会触发任何属性观察者。
构造器
构造器在创建某个特定类型的新实例时被调用。它的最简形式类似于一个不带任何形参的实例方法,以关键字 init 命名:
init() {
// 在此处执行构造过程
}
下面例子中定义了一个用来保存华氏温度的结构体 Fahrenheit,它拥有一个 Double 类型的存储型属性 temperature:
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0
}
}
var f = Fahrenheit()
print("The default temperature is \(f.temperature)° Fahrenheit")
// 打印“The default temperature is 32.0° Fahrenheit”
这个结构体定义了一个不带形参的构造器 init,并在里面将存储型属性 temperature 的值初始化为 32.0(华氏温度下水的冰点)。
(构造器其实就是初始化方法init,在init方法里给属性赋值,就是所谓的构造器中为存储型属性设置初始值)
默认属性值
你可以在构造器中为存储型属性设置初始值。同样,你也可以在属性声明时为其设置默认值。
注意
如果一个属性总是使用相同的初始值,那么为其设置一个默认值比每次都在构造器中赋值要好。两种方法的最终结果是一样的,只不过使用默认值让属性的初始化和声明结合得更紧密。它能让你的构造器更简洁、更清晰,且能通过默认值自动推导出属性的类型;同时,它也能让你充分利用默认构造器、构造器继承等特性,后续章节将讲到。
你可以通过在属性声明时为temperature提供默认值来使用更简单的方式定义结构体Fahrenheit:
struct Fahrenheit {
var temperature = 32.0
}
(属性的默认值最好在声明的时候赋值)
自定义构造过程
你可以通过输入形参和可选属性类型来自定义构造过程,也可以在构造过程中分配常量属性。这些都将在后面章节中提到。
形参的构造过程
自定义构造过程时,可以在定义中提供构造形参,指定其值的类型和名字。构造形参的功能和语法跟函数和方法的形参相同。
下面例子中定义了一个用来保存摄氏温度的结构体Celsius。它定义了两个不同的构造器:init(fromFahrenheit:)和init(fromKelvin:),二者分别通过接受不同温标下的温度值来创建新的实例:
(就是为init方法增加参数,来完善功能)
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius 是 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius 是 0.0
第一个构造器拥有一个构造形参,其实参标签为fromFahrenheit,形参命名为 fahrenheit;第二个构造器也拥有一个构造形参,其实参标签为fromKelvin,形参命名为kelvin。这两个构造器都将单一的实参转换成摄氏温度值,并保存在属性temperatureInCelsius中。