结构体和枚举是值类型
值类型被赋予给一个变量,常数或者本身被传递给一个函数的时候,实际上操作的是其的拷贝。
在之前的章节中,我们已经大量使用了值类型。实际上,在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,并且都是以结构体的形式在后台所实现。
在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
请看下面这个示例,其使用了前一个示例中Resolution
结构体:
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
在以上示例中,声明了一个名为hd
的常量,其值为一个初始化为全高清视频分辨率(1920 像素宽,1080 像素高)的Resolution
实例。
然后示例中又声明了一个名为cinema
的变量,其值为之前声明的hd
。因为Resolution
是一个结构体,所以cinema
的值其实是hd
的一个拷贝副本,而不是hd
本身。尽管hd
和cinema
有着相同的宽(width)和高(height)属性,但是在后台中,它们是两个完全不同的实例。
下面,为了符合数码影院放映的需求(2048 像素宽,1080 像素高),cinema
的width
属性需要作如下修改:
cinema.width = 2048
这里,将会显示cinema
的width
属性确已改为了2048
:
println("cinema is now \(cinema.width) pixels wide")
// 输出 "cinema is now 2048 pixels wide"
然而,初始的hd
实例中width
属性还是1920
:
println("hd is still \(hd.width ) pixels wide")
// 输出 "hd is still 1920 pixels wide"
在将hd
赋予给cinema
的时候,实际上是将hd
中所储存的值(values)
进行拷贝,然后将拷贝的数据储存到新的cinema
实例中。结果就是两个完全独立的实例碰巧包含有相同的数值。由于两者相互独立,因此将cinema
的width
修改为2048
并不会影响hd
中的宽(width)。
枚举也遵循相同的行为准则:
enum CompassPoint {
case North, South, East, West
}
var currentDirection = CompassPoint.West
let rememberedDirection = currentDirection
currentDirection = .East
if rememberDirection == .West {
println("The remembered direction is still .West")
}
// 输出 "The remembered direction is still .West"
上例中rememberedDirection
被赋予了currentDirection
的值(value),实际上它被赋予的是值(value)的一个拷贝。赋值过程结束后再修改currentDirection
的值并不影响rememberedDirection
所储存的原始值(value)的拷贝。
易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
- Java技术群: 227270512 (人数:2000,免费:否)
- MySQL/SQL群: 418407075 (人数:2000,免费:否)
- 大数据开发群: 655154550 (人数:2000,免费:否)
- Python技术群: 287904175 (人数:2000,免费:否)
- 人工智能深度学习: 456236082 (人数:2000,免费:否)
- 测试工程师(新群): 415553199 (人数:1000,免费:否)
- 前端技术群(新群): 410430016 (人数:1000,免费:是)
- C/C++技术(新群): 629264796 (人数:1000,免费:是)
- Node.js技术(新群): 621549808 (人数:1000,免费:是)
- PostgreSQL数据库(新群): 539504187 (人数:1000,免费:是)
- Linux技术: 479429477 (人数:2000,免费:否)
- PHP开发者: 460153241 (人数:2000,免费:否)
- Oracle数据库: 175248146 (人数:2000,免费:否)
- C#/ASP.Net开发者: 579821706 (人数:2000,免费:是)
- 数据分析师: 397883996 (人数:2000,免费:是)R语言,Matlab语言等技术