我理解'价值类型'和'参考类型'。我知道' Structures'是'价值类型'并且根据Swift文档,结构存储的所有值本身都是值类型。现在我的问题是如果我在Struct中有一个存储属性,它是一个类的实例。在这种情况下,整个班级会被复制还是仅仅是其地址?
任何帮助都将不胜感激。
答案 0 :(得分:8)
它将指针复制到实例。我刚刚在操场上测试了这个。
struct MyStruct {
var instance: MyClass
}
class MyClass {
var name: String
init(name: String) {
self.name = name
println("inited \( self.name )") // Prints "inited Alex" only once
}
}
var foo = MyClass(name: "Alex") // make just one instance
var a = MyStruct(instance: foo) // make a struct that contains that instance
var b = a // copy the struct that references the instance
foo.name = "Wayne" // Update the instance
// Check to see if instance was updated everywhere.
a.instance.name // Wayne
b.instance.name // Wayne
不同的是,它现在是对同一个对象的两个不同引用。因此,如果您将一个结构更改为另一个实例,则只是为该结构挂起它。
b.instance = MyClass(name: "Vik")
// a and b no longer reference the same instance
a.instance.name // Wayne
b.instance.name // Vik
游乐场是测试这些问题的好方法。当我读到这个问题时,我当然不知道答案。但现在我做了:))
所以不要害怕去玩。
答案 1 :(得分:2)
我认为你误读了文档。根据The Swift Programming Language,
所有结构和枚举都是Swift中的值类型。这意味着您创建的任何结构和枚举实例 - 以及它们作为属性的任何值类型 - 在代码中传递时始终会被复制。
由于类是引用类型,而不是值类型,即使它们是值类型的属性,也不会复制它们,因此只复制地址。