目录
默认属性值 (在属性声明时为其设置默认值,比构造器里设置好)
不带实参标签的构造器形参 (使用 "_ " 来表示忽略实参)
构造过程中常量属性的赋值(init里可以给常量赋值,init结束后不可变更)
默认构造器 (所有属性都在初始化时设置默认值的行为?Class() )
指定构造器和便利构造器 (每个类必须至少拥有一个指定构造器)
指定构造器(init() ) 和便利构造器 (convenience init() ) 的语法
必要构造器(构造器前添加 required 该类的子类都必须实现)
构造过程(实体的初始化等生命周期?)
构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例使用前有个过程是必须的,它包括设置实例中每个存储属性的初始值和执行其他必须的设置或构造过程。
存储属性的初始赋值(struct,enumerte)
类和结构体在创建实例时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态
可以在构造器中为存储型属性设置初始值,也可以在定义属性时分配默认值。存储型属性分配默认值或者在构造器中为设置初始值时,它们的值是被直接设置的,不会触发任何属性观察者。
构造器
构造器在创建某个特定类型的新实例时被调用。它的最简形式类似于一个不带任何形参的实例方法,以关键字 init
命名:(示例 在构造器中为存储型属性设置初始值)
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初始化方法)
形参的构造过程 (形参:函数内部调用的参数)
自定义构造过程时,可以在定义中提供构造形参,指定其值的类型和名字。构造形参的功能和语法跟函数和方法的形参相同
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
调用,并没有显形的去调用init
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius 是 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius 是 0.0
形参命名和实参标签(实参标签:函数外部调用使用的参数名)
跟函数和方法形参相同,构造形参可以同时使用在构造器里使用的形参命名和一个外部调用构造器时使用的实参标签。
构造器并不像函数和方法那样在括号前有一个可辨别的方法名。因此在调用构造器时,主要通过构造器中形参命名和类型来确定应该被调用的构造器。正因如此,如果你在定义构造器时没有提供实参标签,Swift 会为构造器的每个形参自动生成一个实参标签。
struct Color {
let red, green, blue: Double
自定义构造器方法一。形参和实参相同
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
自定义构造器方法二
init(white: Double) {
red = white
green = white
blue = white
}
}
构造方法的使用
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let halfGray = Color(white: 0.5)
错误使用
let veryGreen = Color(0.0, 1.0, 0.0)
// 报编译期错误-需要实参标签
不带实参标签的构造器形参 (使用 "_ " 来表示忽略实参)
如果你不希望构造器的某个形参使用实参标签,可以使用下划线(_
)来代替显式的实参标签来重写默认行为。(同函数呀)
struct Celsius {
init(_ celsius: Double){
temperatureInCelsius = celsius
}
}
调用也是没有显性调用 init
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius 为 37.0
可选属性类型 (只声明,不在构造器init里赋值)
有一个逻辑上允许值为空的存储型属性——无论是因为它无法在初始化时赋值,还是因为它在之后某个时机可以赋值为空——都需要将它声明为 可选类型
。可选类型的属性将自动初始化为 nil
,表示这个属性是特意在构造过程设置为空。
class SurveyQuestion {
var text: String
var response: String? 可选型。自动赋值为 nil,表明“暂时还没有字符“
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// 打印“Do you like cheese?”
cheeseQuestion.response = "Yes, I do like cheese."
构造过程中常量属性的赋值(init里可以给常量赋值,init结束后不可变更)
可以在构造过程中的任意时间点给常量属性赋值,只要在构造过程结束时它设置成确定的值。一旦常量属性被赋值,它将永远不可更改
class SurveyQuestion {
let text: String
var response: String?
init(text: String) { 构造器里可以给常量赋值,赋完后不可更改
self.text = text
}
func ask() {
print(text)
}
}
let beetsQuestion = SurveyQuestion(text: "How about beets?")
beetsQuestion.ask()
// 打印“How about beets?”
beetsQuestion.response = "I also like beets. (But not with cheese.)"
默认构造器 (所有属性都在初始化时设置默认值的行为?Class() )
如果结构体或类为所有属性提供了默认值,又没有提供任何自定义的构造器,那么 Swift 会给这些结构体或类提供一个默认构造器。这个默认构造器将简单地创建一个所有属性值都设置为它们默认值的实例。
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
结构体的逐一成员构造器
逐一成员构造器是用来初始化结构体新实例里成员属性的快捷方法。新实例的属性初始值可以通过名字传入逐一成员构造器中。