Swift中的结构值类型

时间:2014-08-18 17:59:57

标签: ios swift ios8

我理解'价值类型'和'参考类型'。我知道' Structures'是'价值类型'并且根据Swift文档,结构存储的所有值本身都是值类型。现在我的问题是如果我在Struct中有一个存储属性,它是一个类的实例。在这种情况下,整个班级会被复制还是仅仅是其地址?

任何帮助都将不胜感激。

2 个答案:

答案 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中的值类型。这意味着您创建的任何结构和枚举实例 - 以及它们作为属性的任何值类型 - 在代码中传递时始终会被复制。

由于类是引用类型,而不是值类型,即使它们是值类型的属性,也不会复制它们,因此只复制地址。