发布于 2015-06-14 01:46:13 | 139 次阅读 | 评论: 0 | 来源: 网络整理
值类型被赋予给一个变量,常数或者本身被传递给一个函数的时候,实际上操作的是其的拷贝。
在 之前的章节中,我们已经大量使用了值类型。实际上,在 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)的拷贝。