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,如示于下图中:
../_images/sharedStateStruct_2x.png
相同的行为适用于枚举:
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。
类:
image.png
结构体和类初始化器
image.png
一旦自定义了结构体的初始化器,那么系统就不再为这个结构体生成其他的初始化器。
image.png
image.png











网友评论