发布于 2015-06-14 01:54:37 | 195 次阅读 | 评论: 0 | 来源: 网络整理
与值类型不同,引用类型在被赋予到一个变量,常量或者被传递到一个函数时,操作的并不是其拷贝。因此,引用的是已存在的实例本身而不是其拷贝。
请看下面这个示例,其使用了之前定义的VideoMode
类:
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
以上示例中,声明了一个名为tenEighty
的常量,其引用了一个VideoMode
类的新实例。在之前的示例中,这个视频模式(video mode)被赋予了HD分辨率(1920*1080)的一个拷贝(hd
)。同时设置为交错(interlaced),命名为“1080i”
。最后,其帧率是25.0
帧每秒。
然后,tenEighty
被赋予名为alsoTenEighty
的新常量,同时对alsoTenEighty
的帧率进行修改:
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
因为类是引用类型,所以tenEight
和alsoTenEight
实际上引用的是相同的VideoMode
实例。换句话说,它们只是同一个实例的两种叫法。
下面,通过查看tenEighty
的frameRate
属性,我们会发现它正确的显示了基本VideoMode
实例的新帧率,其值为30.0
:
println("The frameRate property of tenEighty is now (tenEighty.frameRate)")
// 输出 "The frameRate property of theEighty is now 30.0"
需要注意的是tenEighty
和alsoTenEighty
被声明为常量((constants)而不是变量。然而你依然可以改变tenEighty.frameRate
和alsoTenEighty.frameRate
,因为这两个常量本身不会改变。它们并不储存
这个VideoMode
实例,在后台仅仅是对VideoMode
实例的引用。所以,改变的是被引用的基础VideoMode
的frameRate
参数,而不改变常量的值。
因为类是引用类型,有可能有多个常量和变量在后台同时引用某一个类实例。(对于结构体和枚举来说,这并不成立。因为它们作值类型,在被赋予到常量,变量或者传递到函数时,总是会被拷贝。)
如果能够判定两个常量或者变量是否引用同一个类实例将会很有帮助。为了达到这个目的,Swift 内建了两个恒等运算符:
以下是运用这两个运算符检测两个常量或者变量是否引用同一个实例:
if tenEighty === alsoTenTighty {
println("tenTighty and alsoTenEighty refer to the same Resolution instance.")
}
//输出 "tenEighty and alsoTenEighty refer to the same Resolution instance."
请注意“等价于”(用三个等号表示,===) 与“等于”(用两个等号表示,==)的不同:
当你在定义你的自定义类和结构体的时候,你有义务来决定判定两个实例“相等”的标准。在章节运算符函数(Operator Functions)中将会详细介绍实现自定义“等于”和“不等于”运算符的流程。
如 果你有 C,C++ 或者 Objective-C 语言的经验,那么你也许会知道这些语言使用指针来引用内存中的地址。一个 Swift 常量或者变量引用一个引用类型的实例与 C 语言中的指针类似,不同的是并不直接指向内存中的某个地址,而且也不要求你使用星号(*)来表明你在创建一个引用。Swift 中这些引用与其它的常量或变量的定义方式相同。