Swift for-in循环遍历数组的基础使用误区问题解答
Swift for-in遍历数组的核心认知误区解答
所有问题的核心错误点完全一致:Swift中使用for 变量 in 数组的for-in语法遍历数组时,循环变量拿到的是数组当前位置的元素值本身,不是元素对应的索引下标,你全程把循环变量当成了索引下标使用,才会出现所有不符合预期的表现。
问题1:第一段代码无法按预期逐次打印原始元素的原因
你的代码如下:
var numbers = [1, 5, 7, 6, 6, 6, 6, 6, 2] for i in numbers{ print(numbers[i],terminator: "") }
- 循环中的
i每次取到的是数组元素值,而非索引:循环第一轮i=1,第二轮i=5,第三轮i=7,后续依次取到6、6、6、6、6、2。 - 你写
numbers[i]相当于拿元素值当下标访问数组:第一轮取numbers[1]即数组第二个元素5,第二轮取numbers[5]即数组第六个元素6,第三轮取numbers[7]即数组第八个元素6,输出的内容、顺序和原始数组元素完全不匹配;如果数组中存在大于等于数组长度的元素值,还会直接触发数组越界崩溃。 - 正确的逐元素打印有两种常规写法:
- 直接遍历元素打印:
for item in numbers { print(item, terminator: "") }- 遍历索引再按下标取值:
for index in numbers.indices { print(numbers[index], terminator: "") }
问题2:循环内赋值打印正常、外部遍历结果不一致的原因
你的代码如下:
// 循环内赋值+打印 for j in numbers{ numbers[j] = Int.random(in: 0...2) print(numbers[j],terminator: "") } // 循环外再次遍历打印 for k in numbers{ print(numbers[k],terminator: "") }
- 这里的
j、k都是元素值而非索引,整个赋值和打印逻辑全程错位:- 第一轮循环j取原始数组第一个元素1,你实际修改的是
numbers[1]也就是数组第二个位置的值,打印的也是这个刚修改的位置的值,看起来是0~2区间的正常输出 - 后续循环中,j会依次取到未被修改的原始元素值,甚至是之前循环刚改出来的新值,你根本没有按顺序覆盖数组的每一个位置,只是随机挑了和当前j值对应的下标位置修改,数组里大部分位置还保留着原始值
- 循环外再次遍历时,
k拿到的是这份改了一半的数组里的元素值,你再拿这些值当下标访问数组,取到的位置和之前赋值、打印的位置完全不对应,输出结果自然和循环内的打印结果不一致,同样存在越界崩溃的风险。
- 第一轮循环j取原始数组第一个元素1,你实际修改的是
- 正确的全量赋值+打印写法如下:
// 遍历所有索引,给每个位置赋值 for index in numbers.indices { numbers[index] = Int.random(in: 0...2) print(numbers[index], terminator: "") } // 外部遍历验证结果 for item in numbers { print(item, terminator: "") }
问题3:直接打印遍历变量时值固定、不符合0~2区间的原因
你的代码如下:
for m in numbers{ print(m,terminator: "") }
- 这段代码是在上一段错误的赋值逻辑之后执行的:上一段代码并没有把数组所有元素都改成02的随机整数,只修改了部分位置的元素,剩余位置还保留着最初的原始值(比如初始的1、5、7、2这类本来就不在02区间的数)
- 这时候循环里的
m拿到的就是数组中实际存储的残留值,这些值本身就不符合0~2的预期;如果你没有重新执行正确的赋值逻辑,数组里存储的内容不会自动变化,每次打印的结果自然是固定的。 - 只要替换为上面给出的正确索引遍历写法给所有元素重新赋值,再直接打印遍历到的元素,就能得到符合预期的0~2区间随机值。
内容的提问来源于stack exchange,提问作者helpme
相关产品推荐
相关产品推荐

