Swift中for循环修改数组元素后循环内打印仍为旧值的问题
现象原因说明
- 首先Swift中的数组属于值类型,当你使用
for (index,item) in arr3.enumerated()启动遍历的时候,系统会首先对执行遍历前的arr3生成一份只读的快照,循环中拿到的每一个item都是这份初始快照里的元素值拷贝,和后续修改后的原数组没有关联。 - 你在循环内部修改
arr3[index+1]的操作,作用的是原数组的内存空间,因为值类型的写时复制特性,修改操作不会同步更新遍历用的初始快照,所以循环里打印的item一直是遍历开始时的旧值。 - 你最终打印整个数组得到的是修改后的结果,是因为你操作的确实是原数组本身,只是遍历用的快照没有同步更新而已。
解决方法
如果要输出修改后的实时值,直接通过下标访问原数组的当前元素即可,把循环内的 print(item) 替换为 print(arr3[index]) 就能得到你预期的输出,修正后代码如下:
var arr3 = [1,2,3] for (index,_) in arr3.enumerated() { if index+1 < arr3.count { arr3[index + 1] = arr3[index+1] + 1 } print(arr3[index]) } print(arr3)
内容的提问来源于stack exchange,提问作者Himan Dhawan
相关产品推荐
相关产品推荐

