我只是在尝试如果创建结构的副本,则结构中的类变量的值是多少。下面是代码
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
我无法理解输出为何如此?我只是在尝试,没有特定的理由将类变量包含在结构中。
答案 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”。