2016-11-19 124 views
-1

当创建对象的实例时,如果将该属性分配给另一个变量,则无法设置其属性。Swift 3 references

例如,对于包含嵌套对象的对象,我想将其中一个孩子分配给一个临时变量,以使其更容易处理。

而不是做这个(工作)的:

myObj.myChildObject[0].someOtherChild[0].property = "something" 

我试图做的事:

var t = myObj.myChildObject[0].someOtherChild[0] 
t.property = "something" 
// this doesn't throw an error but doesn't change the value of myObj 

是怎么回事?

编辑>

这里是一个人为的例子来说明:

class Car { var name: String = "" } 

var merc = Car() 
var obj = merc.name 

merc.name = "C63 AMG" 
obj = "E300" 

print("merc.name: \(merc.name)") // prints merc.name: C63 AMG 
print("obj.name: \(obj)") // prints obj.name: E300 

var ob2 = merc 
ob2.name = "Toyota" 
print("ob2.name: \(ob2.name)") // prints ob2.name: Toyota 
print("merc.name: \(merc.name)") // prints merc.name: Toyota 

所以分配类实例的变种会创建一个参考。但是将该对象的属性赋值给另一个var会创建一个副本?

我通过https://developer.apple.com/swift/blog/?id=10读,还是不明白:(

在上面,“OBJ”不是一个结构,枚举或元组,所以它不应该是引用类型?

+1

编辑您的问题讨论,显示类型的'myObj','myChildObj'和'someOtherChild'有人也许能帮助你。 – CRD

回答

-1

如果myObj.myChildObject[0].someOtherChild[0]是值类型(即严格,直接枚举或元组),它是被在分配复制到t,后续的突变在t只变异是副本,原始实例保持不变。

你将不得不重新分配t回到:

var t = myObj.myChildObject[0].someOtherChild[0] 
t.property = "something" 
myObj.myChildObject[0].someOtherChild[0] = t 

这在the Swift language guide.

+0

谢谢亚历山大。我只是在阅读价值vs引用类型在这里:https://developer.apple.com/swift/blog/?id=10它说,一个引用类型将复制引用到同一个对象,这就是我'之后。 在他上面的情况下,数组中的对象是自定义类,而不是结构。 我误解了什么? – nugget

+0

嗯,我不确定你期望我能说什么,因为你没有显示这些结构/对象是什么 – Alexander

+2

抱歉,这是错误的。 *参考*类型不会在赋值时被复制,*值*类型是。 – CRD