关于swift数组
2018-08-08 本文已影响8人
本帅不良
今天在对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