2016-11-19 42 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