事情發生在我需要給一個數組中符合條件的model某個屬性重新賦值時。
下面是示例的代碼。
struct TestStruct {
var str: String = ""
}
var arr1: [TestStruct] = []
var arr2: [TestStruct] = []
for _ in 0..<5 {
let s1 = TestStruct(str: "One")
let s2 = TestStruct(str: "Two")
arr1.append(s1)
arr2.append(s2)
}
for s1 in arr1 {
for var s2 in arr2 {
s2.str = s1.str
}
}
// 預期是 arr2 中的所有TestStruct的str屬性值變為 One
for s in arr2 {
print(s.str) // 實際結果 Two Two Two Two Two
}
這樣寫之后,發現arr2中的值并沒有如我們想象的一樣。
在Swift中,結構體屬于數值類型,不同于類的引用。
類,在每次賦值時,只是增加了對它的引用;
結構體,在發生賦值時都是復制了一個新的結構體對象。
所以我們對上面的代碼做一些修改:
/**
* for s1 in arr1 {
* for var s2 in arr2 {
* s2.str = s1.str // 這里將arr2 的 TestStruct取出賦值給 s2, 實際會重新復制一個出來,s2 并不是 arr2 內存儲的那個結構體。
* }
* }
*/
for s1 in arr1 {
for index in 0..<arr2.count {
arr2[index].str = s1.str // 這里直接使用下標取出arr2中的TestStruct。
}
}
for s in arr2 {
print(s.str) // One One One One One
}
這樣我們就完成了賦值啦。