为什么class变量在struct中没有值迅速

时间:2019-02-24 11:12:02

标签: ios swift class struct

我只是在尝试如果创建结构的副本,则结构中的类变量的值是多少。下面是代码

import Foundation

class Name {
    var name :String

    init(nname : String) {
        self.name = nname
    }
}

struct A {
    var NewName: Name
    var age: Int = 0

    init(nName: Name,nAge : Int){
        self.age = nAge
        self.NewName = nName
    }
}

var myName = Name(nname : "Sia")
var test1 = A(nName: myName,nAge:30)
var test2 = test1
print(test1.NewName)
print(test2.NewName)

输出

__lldb_expr_182.Name
__lldb_expr_182.Name

我无法理解输出为何如此?我只是在尝试,没有特定的理由将类变量包含在结构中。

2 个答案:

答案 0 :(得分:1)

由于Name是一个类,因此存储在结构(NewName)中的属性值是对该类实例的引用。当您将结构复制到另一个结构时,您将复制参考值(即实例存储在内存中的地址)。因此,这两个属性引用相同的Name实例并显示相同的打印值(尽管两个结构具有不同的实例)。

编辑:如果您要说明为什么它不显示“ Sia”

您正在打印参考值,而不是存储在其中的属性。 (NewName不是字符串,而是对类的引用)

答案 1 :(得分:1)

您根本没有使用类变量,而是使用了实例变量。 class 变量对于整个类仅存在一次。每个类的每个实例(或该结构的实例)的 instance 变量都不同。这只会使读者对您的问题感到困惑。

Swift类和Swift结构之间的最大区别是,类是引用,而结构是。当您分配myName = Name(nname:“ Sia”)时,您将创建一个Name类型的实例,而myName是对该实例的引用。

test1是新创建的结构。它不包含myName的值,它包含一个引用。 test2也是一个新创建的结构。它不会从test1复制整个Name对象,而只是复制引用。 test1和test2使用相同的参考。

如果您更改了myName.name =“ abc”,则myName引用的对象内部的值也会更改,因此打印test1.NewName.name或test1.NewName.name将打印“ abc”。