如果您有一个具有变量属性的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是一个值类型,但我不确定。
答案 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。
以下是其他一些很好的资源来解释其他语言的参考与价值类型。虽然它们并不是专门针对Swift的,但同样的概念也适用:
Joseph Albahari's explanation of value vs. reference types in C#