Swift结构体初始化

初始化方法的基本目的是给类型的所有存储属性赋值,以便新实例可用。编译器会强制要求新实例的存储属性有值。如果没有为自定义结构体提供初始化方法,就必须通过默认值或成员初始化方法提供必要的值。

初始化方法一般形式:

1
2
3
4
5
struct CustomType{
init(someValue: SomeType){
//初始化代码
}
}

初始化方法用关键字init表示,没有返回值,也不加function关键字。不同的初始化方法根据参数名及其类型的不同来区分。

  1. 空初始化方法

    特点:没有参数;结构体中的属性都有默认值;给新实例的属性指定默认值。

    示例:

    1
    2
    3
    4
    5
    6
    7
    struct Town{
    let region = "South"
    var population = 5_422
    var numbersOfStoplights = 4
    }

    var myTown = Town() //Town后的()表示调用空初始化方法
  2. 成员初始化方法

    特点: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)
  3. 自定义初始化方法

    特点:Swift不再提供默认的初始化方法。

    注意:Swift编译器允许在初始化过程中初始化常量属性

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    struct 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)
  4. 委托初始化方法

    特点:调用其他初始化方法;避免代码重复。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    struct 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)