结构体¶
结构体¶
在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关键字定义了一个下标,通过传入一个整型值,将结构体的属性乘以若干倍,并返回最终的乘积结果。