结构体

结构体

在Swift开发环境中,结构体是构建代码所用的一种通用且灵活的构造体。 可以为结构体定义常量或变量的属性,设置可以像枚举一样,给结构体添加方法,从而扩展结构体的功能。

结构体的定义

结构体的定义格式和枚举即为相似,其是以 struct 关键字来进行定义的,并且也将结构体的内容放置在一堆大括号之中。

1
2
3
4
 struct 结构体名称
 {
    // 此处放置结构体的内容
 }

在动物园的管理系统中,你可以将动物定义为一个结构体:

1
2
3
4
5
 struct Animal
 {
    let zooName: String = "cz Zoo"
    var name: String
 }

在第一行的代码中,使用struct关键字定义了一个名为Animal的结构体。 由于动物园的名称是固定的,所以定义了一个名为 zooName 的字符串常量,并且设置了一个默认值 cz Zoo。 接着又定义了一个name的字符串变量,作为每个动物的名称属性。

对于结构的实例化,你可以采用这种方式:

1
 let animal = Animal(name: "Tiger")

通过print语句可以输出animal结构体的name属性:

1
 print(animal.name)  // 输出结果为: Tiger

还可以修改结构实例的name属性:

1
2
3
 var animal = Animal(name: "Tiger")
 animal.name = "Dog"
 print(animal.name)  // 输出结果为: Dog

注意:类是引用类型,而结构体和枚举都是值类型。值类型是一种当它被指定为常量或者变量,或者被传递给函数时会被拷贝的类型。这也就意味着你所创建的任何结构体和枚举实例,作为属性所含的任意值类型,在代码传递中总是被拷贝的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 struct Animal {
    var name: String = ""
 }

 var animal = Animal()
 animal.name = "Dog"
 var animal2 = animal
 animal2.name = "Tiger"

 print(animal.name)  //输出结果: Dog
 print(animal2.name) //输出结果: Tiger

在上面的代码中,创建了一个Animal的结构体的实体,并让其name属性为Dog 接着,将animal实例赋予animal2变量。当animal被赋予animal2变量时,animal的值就被拷贝了一份,并将拷贝的实例赋予animal2变量。这就产生了两个不同的实例,所以当animal2的name属性被修改后,animal的值并不会发生变化。

给结构体添加方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 struct Animal {
    var name: String = ""
    func say() {
        print("Hi, I'm \(name)")
    }
 }

 let dog = Animal()
 dog.name = "dog"
 dog.say()  //输出结果: Hi, I'm dog

上记代码中,给Animal结构体添加了一个名为 say 的方法,在改方法中打印输出了其自身的名称。 如果想要在添加的方法中修改属性的值,需要在func前添加 mutating 关键字。

1
2
3
4
5
6
7
 struct Animal {
    var name: String = ""

    mutating func setName(name: String) {
       self.name = name
    }
 }

结构体的下标

结构体,类和枚举都可以定义下标,它可以作为访问集合,列表或序列成员元素的快捷方式。 下标的语法是使用关键字 subscript 来定义,并且指定一个或多个输入形式和返回值类型。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 struct MySubscript
 {
    var number: Int
    subscript(n: Int) -> Int
    {
       return number * n
    }
 }

 let subScript = MySubscript(number: 4)
 print(subScript[3])  // 输出结果: 12

这里定义了一个名为MySubscript的结构体,它拥有一个名为number的整型属性。 使用subscript关键字定义了一个下标,通过传入一个整型值,将结构体的属性乘以若干倍,并返回最终的乘积结果。