Swift教程之类与结构详解

2020-01-08 22:44:25丽君

如果把cinema的宽度更改为2048,hd的宽度不会变化,依然是1920

 

复制代码  
cinema.width = 2048
println("cinema is now (cinema.width) pixels wide")
// prints "cinema is now 2048 pixels wide"
println("hd is still (hd.width) pixels wide")
// prints "hd is still 1920 pixels wide"
这表明当hd被赋值给cinema时,是完整地复制了一个全新的Resolution结构给cinema,所以当cinema的属性被修改时,hd的属性不会变化。

 

下面的例子演示的是枚举类型:

 

复制代码
enum CompassPoint {
case North, South, East, West
}
var currentDirection = CompassPoint.West
let rememberedDirection = currentDirection
currentDirection = .East
if rememberedDirection == .West {
println("The remembered direction is still .West")
}
// prints "The remembered direction is still .West"

 

尽管经过几次赋值,rememberedDirection依然没有变化,这是因为在每一次赋值过程中,都是将数值类型完整地复制了过来。

3、类是引用类型

和数值类型不同引用类型不会复制整个实例,当它被赋值给另外一个常量或者变量的时候,而是会建立一个和已有的实例相关的引用来表示它。

下面是引用的示例,VideoMode被定义为一个类:

 

复制代码  
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
分别将这个实例tenEighty的四个属性初始化,然后tenEighty被赋值给了另外一个叫alsoTenEighty的常量,然后alsoTenEighty的frameRate被修改了

 

 

复制代码
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
由于类是一个引用类型,所以tenEighty和alsoTenEighty实际上是同一个实例,仅仅只是使用了不同的名称而已,我们通过检查frameRate可以证明这个问题:

 

 

复制代码