我有下面的代码。
var myArray : [String] = ["1", "2", "3", "4", "5"]
for var i in 0..<myArray.count {
print("i==\(i)==\(myArray[i])")
myArray.remove(at: i)
i = i-1
}
日志如下。
i==0==1
i==1==3
i==2==5
fatal error: Index out of range
我期望的日志是
i==0==1
i==0==2
i==0==3
i==0==4
i==0==5
之所以这样说,是因为当我在for循环中设置i=i-1
时,i
将始终为0。
这意味着变量i
无效,代码为i=i-1
知道为什么会这样吗?
我在Java中具有相同的代码,并且工作正常。
ArrayList<String> mm = new ArrayList<>();
mm.add("1");
mm.add("2");
mm.add("3");
mm.add("4");
mm.add("5");
for(int i=0; i<mm.size(); i++){
Log.d("mm", "i=="+i+"=="+mm.get(i));
mm.remove(i);
i = i-1;
}
我的日志如下
i==0==1
i==0==2
i==0==3
i==0==4
i==0==5
答案 0 :(得分:4)
Swift for循环的工作方式与您想象的有所不同。
首先要注意,node
之后的位仅被评估一次。它不会在每次迭代中获得数组的计数。 in
可以完全替换为0..<array.count
,结果不会有什么不同。
第二件事是,即使您在循环中设置了0..<5
,i
的值也不会是您在下一次迭代中设置的值。这是因为在每次迭代的开始,i
被分配了序列中的下一个元素。这意味着无论您为i
分配什么,i
都将保留该值,直到当前迭代结束为止。
现在,我们可以解释输出了。
第一次迭代,i
为0,因此将打印索引为0的元素。第一个元素被删除。数组现在为i
。
第二次迭代,["2", "3", "4", "5"]
为1,因此索引1处的元素被打印(i
)。第二个元素被删除。数组现在为3
。
第三次迭代,["2", "4", "5"]
为2,因此打印了索引2处的元素(i
)。第三个元素被删除。数组现在为5
。
第四次迭代,["2", "4"]
为3,但数组只有2个元素,因此索引超出范围。