事情發(fā)生在我需要給一個數(shù)組中符合條件的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
}
}
// 預(yù)期是 arr2 中的所有TestStruct的str屬性值變?yōu)?One
for s in arr2 {
print(s.str) // 實際結(jié)果 Two Two Two Two Two
}
這樣寫之后胡嘿,發(fā)現(xiàn)arr2中的值并沒有如我們想象的一樣。
在Swift中钳踊,結(jié)構(gòu)體屬于數(shù)值類型衷敌,不同于類的引用。
類拓瞪,在每次賦值時缴罗,只是增加了對它的引用;
結(jié)構(gòu)體祭埂,在發(fā)生賦值時都是復(fù)制了一個新的結(jié)構(gòu)體對象面氓。
所以我們對上面的代碼做一些修改:
/**
* for s1 in arr1 {
* for var s2 in arr2 {
* s2.str = s1.str // 這里將arr2 的 TestStruct取出賦值給 s2, 實際會重新復(fù)制一個出來,s2 并不是 arr2 內(nèi)存儲的那個結(jié)構(gòu)體蛆橡。
* }
* }
*/
for s1 in arr1 {
for index in 0..<arr2.count {
arr2[index].str = s1.str // 這里直接使用下標(biāo)取出arr2中的TestStruct舌界。
}
}
for s in arr2 {
print(s.str) // One One One One One
}
這樣我們就完成了賦值啦。