怪异的循环

时间:2018-12-04 09:14:27

标签: swift for-loop

我有下面的代码。

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

1 个答案:

答案 0 :(得分:4)

Swift for循环的工作方式与您想象的有所不同。

首先要注意,node之后的位仅被评估一次。它不会在每次迭代中获得数组的计数。 in可以完全替换为0..<array.count,结果不会有什么不同。

第二件事是,即使您在循环中设置了0..<5i的值也不会是您在下一次迭代中设置的值。这是因为在每次迭代的开始,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个元素,因此索引超出范围。