Swift结构体初始化
初始化方法的基本目的是给类型的所有存储属性赋值,以便新实例可用。编译器会强制要求新实例的存储属性有值。如果没有为自定义结构体提供初始化方法,就必须通过默认值或成员初始化方法提供必要的值。
初始化方法一般形式:
1 | struct CustomType{ |
初始化方法用关键字init
表示,没有返回值,也不加function
关键字。不同的初始化方法根据参数名及其类型的不同来区分。
空初始化方法
特点:没有参数;结构体中的属性都有默认值;给新实例的属性指定默认值。
示例:
1
2
3
4
5
6
7struct Town{
let region = "South"
var population = 5_422
var numbersOfStoplights = 4
}
var myTown = Town() //Town后的()表示调用空初始化方法成员初始化方法
特点:Swift默认提供;方法里包含了类型的每个存储属性对应的参数(初始化完成时,新实例的所有存储属性都需要有值);可以给实例的属性指定新值(覆盖默认值)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//1. 常量属性有默认值的情况下,初始化方法不包含常量属性
struct Town{
let region = "South"
var population = 5_422
var numbersOfStoplights = 4
}
var myTown = Town(population:1_000,numbersOfStoplights:6)
//myTown中的population不再是5_422,而是1_000,numberOfStoplights也变成了6
//2. 常量属性没有默认值的情况下,初始化方法需要包含常量属性
struct Town{
let region :String
var population = 5_422
var numbersOfStoplights = 4
}
var myTown = Town(region:"North", population:1_000, numbersOfStoplights:6)
print(myTown)自定义初始化方法
特点:Swift不再提供默认的初始化方法。
注意:Swift编译器允许在初始化过程中初始化常量属性
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17struct Town{
let region: String
var population: Int{
didSet(oldPolulation){
print("The population has changed to \(population)")
}
}
var numberOfStoplights: Int
init(region: String, population: Int, stoplights: Int){
self.region = region//初始化参数名和属性名一样,访问属性需要指定self
self.population = population
numberOfStoplights = stoplights
}
}
var myTown = Town(region:"North",population: 1200, stoplights:3)委托初始化方法
特点:调用其他初始化方法;避免代码重复。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23struct Town{
let region: String
var population: Int{
didSet(oldPolulation){
print("The population has changed to \(population)")
}
}
var numberOfStoplights: Int
//指定初始化方法
init(region: String, population: Int, stoplights: Int){
self.region = region//初始化参数名和属性名一样,访问属性需要指定self
self.population = population
numberOfStoplights = stoplights
}
//委托初始化方法
init(population: Int, stoplights: Int){
self.init(region:"West",population: population,stoplights:stoplights)
}
}
var myTown = Town(region:"North",population: 1200, stoplights:3)