事情發(fā)生在我需要給一個(gè)數(shù)組中符合條件的model某個(gè)屬性重新賦值時(shí)。
下面是示例的代碼。
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) // 實(shí)際結(jié)果 Two Two Two Two Two
}
這樣寫之后,發(fā)現(xiàn)arr2中的值并沒(méi)有如我們想象的一樣。
在Swift中,結(jié)構(gòu)體屬于數(shù)值類型,不同于類的引用。
類,在每次賦值時(shí),只是增加了對(duì)它的引用;
結(jié)構(gòu)體,在發(fā)生賦值時(shí)都是復(fù)制了一個(gè)新的結(jié)構(gòu)體對(duì)象。
所以我們對(duì)上面的代碼做一些修改:
/**
* for s1 in arr1 {
* for var s2 in arr2 {
* s2.str = s1.str // 這里將arr2 的 TestStruct取出賦值給 s2, 實(shí)際會(huì)重新復(fù)制一個(gè)出來(lái),s2 并不是 arr2 內(nèi)存儲(chǔ)的那個(gè)結(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
}
這樣我們就完成了賦值啦。