swift 中类和结构体的区别
结构和类
结构和类是通用的,灵活的结构,它们成为程序代码的构建块。您可以定义属性和方法,以使用与定义常量,变量和函数相同的语法向结构和类添加功能。
与其他编程语言不同,Swift不需要您为自定义结构和类创建单独的接口和实现文件。在Swift中,您可以在一个文件中定义一个结构或类,并且该类或结构的外部接口会自动提供给其他代码使用。
笔记
传统上将类的实例称为对象。然而,夫特结构和类在功能上更接近比在其他语言,等等本章的描述适用于实例功能任一类或结构类型。因此,使用了更通用的术语实例。
比较结构和类
Swift中的结构和类有很多共同点。两者都可以:
定义属性以存储值
定义提供功能的方法
定义下标以使用下标语法提供对它们的值的访问
定义初始值设定项以设置其初始状态
扩展以扩展其功能,使其超出默认实现
符合协议以提供某种标准功能
类具有结构没有的其他功能:
继承使一个类可以继承另一个类的特征。
通过类型转换,您可以在运行时检查和解释类实例的类型。
反初始化程序使类的实例释放其已分配的任何资源。
引用计数允许对一个类实例进行多个引用。
Swift中的所有基本类型(整数,浮点数,布尔值,字符串,数组和字典)都是值类型(来自官方文档)
考虑以下示例,该示例使用Resolution
上一个示例的结构:
1. let hd = Resolution(width: 1920, height: 1080)
2. var cinema = hd
本示例声明一个常量hd
,并将其设置为使用Resolution
全高清视频的宽度和高度(1920像素宽x 1080像素高)初始化的实例。
然后,它声明一个名为的变量cinema
,并将其设置为的当前值hd
。因为Resolution
是结构,所以将创建现有实例的副本,并将此新副本分配给cinema
。尽管现在hd
和cinema
现在具有相同的宽度和高度,但它们是幕后的两个完全不同的实例。
接下来,将的width
属性cinema
修改为用于数字电影放映的稍宽的2K标准的宽度(宽2048像素,高1080像素):
1. cinema.width = 2048
检查的width
属性cinema
表明它确实已更改为2048
:
1. print("cinema is now \(cinema.width) pixels wide")
2. // Prints "cinema is now 2048 pixels wide"
但是,width
原始hd
实例的属性仍然具有旧值1920
:
1. print("hd is still \(hd.width) pixels wide")
2. // Prints "hd is still 1920 pixels wide"
当cinema
提供了的当前值时hd
,存储在中的值将hd
复制到新cinema
实例中。最终结果是两个完全独立的实例,其中包含相同的数值。然而,因为它们是独立的情况下,设定的宽度cinema
,以2048
不影响存储在所述宽度hd
,如示于下图中:
相同的行为适用于枚举:
1. enum CompassPoint {
2. case north, south, east, west
3. mutating func turnNorth() {
4. self = .north
5. }
6. }
7. var currentDirection = CompassPoint.west
8. let rememberedDirection = currentDirection
9. currentDirection.turnNorth()
11. print("The current direction is \(currentDirection)")
12. print("The remembered direction is \(rememberedDirection)")
13. // Prints "The current direction is north"
14. // Prints "The remembered direction is west"
当rememberedDirection
被赋予的价值currentDirection
,它实际上是设置为该值的副本。更改currentDirection
其后的值不会影响存储在中的原始值的副本rememberedDirection
。
类:
结构体和类初始化器
一旦自定义了结构体的初始化器,那么系统就不再为这个结构体生成其他的初始化器。