Swift:如何在for循环中删除遍历所用的原数组元素?
问题原因
Swift 中使用 for...in 遍历数组时,会创建原数组的不可变快照副本。循环过程中对原数组的修改(比如 removeLast())不会影响这个快照的遍历流程——你的代码在循环启动时就拿到了包含全部6个元素的快照,所以哪怕原数组不断被缩短,遍历还是会把快照里的所有元素都输出一遍。
解决方案
方法1:用 while 循环控制遍历次数
通过数组的长度来控制循环终止条件,确保只输出前3个元素并同步删除尾部元素:
var letters = ["a", "b", "c", "d", "e", "f"] // 目标是保留前3个元素,所以当数组长度大于3时继续循环 while letters.count > 3 { print(letters.first!) letters.removeLast() }
执行后输出 a、b、c,最终数组变为 ["a", "b", "c"],符合预期。
方法2:遍历数组的前缀序列
直接遍历原数组的前3个元素的前缀序列,同时修改原数组:
var letters = ["a", "b", "c", "d", "e", "f"] for element in letters.prefix(3) { print(element) letters.removeLast() }
prefix(3) 会生成原数组前3个元素的临时序列,循环仅执行3次,每次删除原数组的最后一个元素,最终效果和方法1一致。
方法3:指定遍历次数并同步修改
直接指定遍历次数,基于原数组的索引访问元素,同时修改原数组:
var letters = ["a", "b", "c", "d", "e", "f"] // 仅遍历前3个元素的索引 for index in 0..<3 { print(letters[index]) letters.removeLast() }
这种方式逻辑直接,适合明确知道需要遍历次数的场景。
内容的提问来源于stack exchange,提问作者Shay Dans
相关产品推荐
相关产品推荐

