【问题标题】:foor loop behaving weirdlyfor 循环行为怪异
【发布时间】:2018-12-04 09:14:27
【问题描述】:

我有以下代码。

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

【问题讨论】:

  • “我这样说是因为当我在 for 循环中设置 i=0 时,它不应该出现在第二个循环中。” 为什么不呢?顺便说一句,这是您的代码的正确输出。
  • 这里的解释很清楚:stackoverflow.com/questions/11905606/…
  • 您需要逆序迭代您的收藏
  • @RakeshaShastri:我已经更新了问题...请检查...
  • 顺便说一句,该代码只是对语言的假设实验还是应该在实际项目中使用?因为从您当前正在迭代的集合中删除元素,同时通过索引访问它总是一个坏主意。

标签: swift for-loop


【解决方案1】:

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

首先要注意in 之后的位只计算一次。它不会在每次迭代中获得数组的计数。 0..&lt;array.count 完全可以替换成0..&lt;5,结果也一样。

第二件事是,即使您在循环中设置了ii 的值也不会是您在下一次迭代中设置的值。这是因为在每次迭代开始时,i 被分配了序列中的下一个元素。这意味着无论您分配给ii 都只会保留该值,直到当前迭代结束。

现在,我们可以解释一下输出了。

第一次迭代,i 为 0,因此索引 0 处的元素被打印。第一个元素被删除。数组现在是["2", "3", "4", "5"]

第二次迭代,i 为 1,因此索引 1 处的元素被打印 (3)。第二个元素被删除。数组现在是["2", "4", "5"]

第三次迭代,i 为 2,因此索引 2 处的元素被打印 (5)。第三个元素被删除。数组现在是["2", "4"]

第四次迭代,i 为 3,但数组只有 2 个元素长,因此索引超出范围。

【讨论】:

  • Second thing 是我的想法。所以确认一下,这种行为是 Swift 的一部分。
  • @FahimParkar 它是 swift 的一部分。 for...in 我所知道的大多数其他语言的循环也有这种行为。 C 风格的 for 循环不这样做。
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多