如何在Swift 3中为for循环中修改的数组编写for循环?

Qua*_*ees 39 arrays for-loop ios swift swift3

所以,我有一个类似于这个的for循环:

for var i = 0; i < results.count ; i += 1 {
   if (results[i] < 5) {
      results.removeAtIndex(i)
      i -= 1
   }
}
Run Code Online (Sandbox Code Playgroud)

这曾经工作过.但当我将其更改为首选的Swift 3.0语法时:

for var i in 0..<results.count {
   if (results[i] < 5) {
      results.removeAtIndex(i)
      i -= 1
   }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个数组IOOBE异常,因为它不会重新检查计数并继续直到原始results.count.

我该如何解决?它现在有效,但我不想在将来遇到麻烦.

Unh*_*lig 66

虽然使用的解决方案filter是一个很好的解决方案,而且它更加迅捷,但还有另一种方法,如果使用for-inis仍然需要:

var results = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for var i in (0..<results.count).reverse()
{
    if (results[i] < 5)
    {
        results.removeAtIndex(i)
        //i -= 1
    }
}

print(results)
Run Code Online (Sandbox Code Playgroud)

结果:

[5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

另外,我们可以i -= 1完全省略这一行.

removeAtIndex循环内部的问题是它不会导致数组就地重新索引,从而导致数组因为count没有更新而超出边界异常.

通过向后遍历,可以避免出界异常.

  • 天啊……真是太聪明了。是的,我知道过滤方式会更*迅速*,但我认为这种方式更适用,会使用它。谢谢! (2认同)

Bra*_*ega 17

你能用filter吗?

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let greaterThan5 = numbers.filter{$0 >= 5}
print(greaterThan5)
Run Code Online (Sandbox Code Playgroud)


Luk*_*itz 10

如果要继续使用for-loop,可以使用以下命令枚举索引和元素enumerate:

for (index, element) in results.enumerate() {
   if (element < 5) {
     results.removeAtIndex(index)
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然取决于您在循环中所做的事情,但该filter方法可能是更好的主意.

  • 这是一个坏主意,在某些情况下你会遇到超出范围的陷阱,例如尝试数组`[6,5,4,3,2,1]`.原因是在循环中修改了数组,但未调整索引. (8认同)