结构体是复杂的数据类型,这意味着它们由多个值组成。然后创建结构的实例并填充其值,然后可以在代码中将其作为单个值传递。例如,我们可以定义一个Person
结构体类型,它包含两个属性:clothes
和shoes
:
struct Person {
var clothes: String
var shoes: String
}
当您定义一个结构体时,Swift使它们很容易创建,因为它会自动生成所谓的成员初始化器。简单地说,这意味着您可以通过为结构的两个属性传入初始值来创建结构体,如下所示:
代码语言:javascript复制let taylor = Person(clothes: "T-shirts", shoes: "sneakers")
let other = Person(clothes: "short skirts", shoes: "high heels")
一旦创建了结构体的实例,就可以通过写入结构体的名称、点.
和要读取的属性名称来读取其属性:
print(taylor.clothes)
print(other.shoes)
如果将一个结构指定给另一个结构,Swift会在幕后复制它,以便它是原始结构的完整独立副本。好吧,严格来说这不是真的:Swift使用了一种叫做“写时复制”的技术,这意味着它只在你试图更改数据时才实际拷贝你的数据。
为了帮助您了解结构体副本的工作原理,请将这段代码放入您的playground:
代码语言:javascript复制struct Person {
var clothes: String
var shoes: String
}
let taylor = Person(clothes: "T-shirts", shoes: "sneakers")
let other = Person(clothes: "short skirts", shoes: "high heels")
var taylorCopy = taylor
taylorCopy.shoes = "flip flops"
print(taylor)
print(taylorCopy)
这将创建两个Person
结构体,然后创建第三个称为taylorCopy
的结构体作为taylor
的副本。接下来发生的是有趣的部分:代码改变了taylorCopy
,并同时打印了它和taylor
。如果您在结果窗口中查看,您将看到副本与原始结构体具有不同的值:更改一个副本不会更改另一个。
结构体内的函数
您可以将函数放在结构体中,事实上,对于读取或更改结构体中数据的所有函数,这样做是一个好主意。例如,我们可以在Person
结构体中添加一个函数来描述他们的穿着,例如:
struct Person {
var clothes: String
var shoes: String
func describe() {
print("I like wearing (clothes) with (shoes)")
}
}
还有一件事你应该知道,但在代码中看不到:当你在一个结构体中编写一个函数时,它被称为一个方法。在Swift中,无论是函数还是方法,您都可以编写func,但是当您谈到它们时,它们之间的区别会被保留下来。
本文来自Hacking with Swift 给 swift 初学者的入门课程 Swift for Complete Beginners 的 Structs