美文网首页
关于swift数组

关于swift数组

作者: 本帅不良 | 来源:发表于2018-08-08 10:02 被阅读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

相关文章

网友评论

      本文标题:关于swift数组

      本文链接:https://www.haomeiwen.com/subject/ycrtbftx.html