今天在對swift數組進行操作的時候,發現swift數組中元素的拷貝竟是直接的地址拷貝!
當時,我需要新建一個數組,用于存儲原數組的部分值,之后再對新數組的值進行修改,結果發現,修改新數組中的值,如果這個值是從舊數組中獲取到的,則就數組中元素的值也會改變!
之后,我又測試了數組中元素的值的改變,對數組是否有影響。我將數組中元素取出來,對值進行了修改,結果發現數組中的該元素也發生了變化。
不過,這塊沒有深入了解,感覺這種機制似乎有潛在的bug,但大多數情況又是比較好用的。
推薦文章:https://blog.csdn.net/ZY_FlyWay/article/details/79216805
今天發現了其bug的所在,當我進行傳值的時候,我總會將我不想改變的值改變了。最終我采取了一一賦值的方式解決了這個問題。
值得說明的是:數組中元素的拷貝,根本的問題出現在元素本身上。如果我們用
let theItem = item//theItem和item均為類對象
這是就是深拷貝了,theItem和item使用的是同一個地址;所以,我新創建了一個對象用于接收元對象的值(對屬性一一賦值):
let theItem = CheckRuleDetailList()
theItem.signInTime = item.signInTime
theItem.signOutTime = item.signOutTime
theItem.uid = item.uid
theItem.weekList = item.weekList
而實現數組的淺拷貝,則是在此基礎上加了一個for循環
var theArr : [CheckRuleDetailList] = []
//直接的賦值會將地址傳過去,故重新創建對象,一一賦值之后,將數組對象傳過去
for item in classArr {
let theItem = CheckRuleDetailList()
theItem.signInTime = item.signInTime
theItem.signOutTime = item.signOutTim
theItem.uid = item.uid
theItem.weekList = item.weekList
theArr.append(theItem)
}
vc.classArr = theArr