在Swift中,为什么声明为常量的结构无法更新变量属性?

时间:2015-02-11 18:24:18

标签: swift

如果您有一个具有变量属性的Structure并且您将该Structure的实例设置为常量,则无法更新其变量属性,而如果您有一个具有变量属性的Class并将该Class的实例设置为常量,您可以更新其变量属性:

struct StructPoint {
    var x: Int
    var y: Int
}

class ClassPoint {

    var x: Int
    var y: Int

    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var s = StructPoint(x: 2, y: 3)
let s2 = StructPoint(x: 2, y: 3)

s.x = 3    // allowed
s2.x = 5   // not allowed

var p = ClassPoint(x: 2, y: 3)
let p2 = ClassPoint(x: 2, y: 3)

p.x = 4    // allowed
p2.x = 4   // allowed

为什么会这样?我怀疑它与Classes是一个引用类型有关,而Structures是一个值类型,但我不确定。

1 个答案:

答案 0 :(得分:1)

你是对的,这种行为是类是引用类型而结构是值类型的结果。

关于作为参考类型的类的部分用一个简单的例子来解释它:

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
  

注意tenEighty和alsoTenEighty被声明为常量,   而不是变量。但是,你仍然可以改变   tenEighty.frameRate和alsoTightEighty.frameRate因为值   tenEighty和TenEighty常数本身并没有   更改。 tenEighty andTenEighty自己也不“存”了   VideoMode实例 - 相反,它们都引用VideoMode实例   在幕后。它是底层的frameRate属性   更改的VideoMode,而不是常量引用的值   到那个VideoMode。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID89

以下是其他一些很好的资源来解释其他语言的参考与价值类型。虽然它们并不是专门针对Swift的,但同样的概念也适用:

Joseph Albahari's explanation of value vs. reference types in C#

Jon Skeet's explanation of references and values in .NET