Swift 中结构体和类

2021-04-15  本文已影响0人  紫藤花的魂

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。尽管现在hdcinema现在具有相同的宽度和高度,但它们是幕后的两个完全不同的实例。

接下来,将的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
上一篇下一篇

猜你喜欢

热点阅读