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

Posted

技术标签:

【中文标题】如何在 Swift 3 中为我在 for 循环期间修改的数组编写 for 循环?【英文标题】:How do I write a for-loop in Swift 3 for an array that I modify during the for loop? 【发布时间】:2016-10-02 10:32:09 【问题描述】:

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

for var i = 0; i < results.count ; i += 1 
   if (results[i] < 5) 
      results.removeAtIndex(i)
      i -= 1
   

这曾经有效。但是当我把它改成首选的 Swift 3.0 语法时:

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

我得到一个数组 IOOBE 异常,因为它没有重新检查计数并继续直到原来的 results.count

我该如何解决这个问题?它现在有效,但我不想在将来遇到麻烦。

【问题讨论】:

这段代码没有抱怨 var i in 0.. 为什么苹果让 for 循环如此复杂是没有意义的,我不记得在过去的 25 年里遇到过问题 【参考方案1】:

你能改用filter吗?

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let greaterThan4 = numbers.filter$0 >= 5
print(greaterThan4)

【讨论】:

新数组应该命名为greaterThan4 ;) 无论如何这是解决问题的正确方法。 哦,对了!调用它的函数称为“filterArray”。我从来没有建立联系哈哈。但我还需要将过滤后的结果附加到末尾。有什么建议吗?【参考方案2】:

如果您想继续使用for-loop,您可以使用enumerate 枚举索引和元素:

for (index, element) in results.enumerate() 
   if (element < 5) 
     results.removeAtIndex(index)
   

尽管取决于您在循环中执行的操作,filter 方法可能是一个更好的主意。

【讨论】:

这是个坏主意,在某些情况下你会遇到超出范围的陷阱,例如尝试数组[6, 5, 4, 3, 2, 1]。原因是循环中修改了数组但没有调整索引。【参考方案3】:

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

func removeBelow(value: Int) 
    var results = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    for i in (0 ..< results.count).reversed() 
        if (results[i] < value) 
            results.remove(at: i)
        
    

    print(results)


removeBelow(value: 5)

结果:

[5, 6, 7, 8, 9, 10]

循环中removeAtIndex 的问题在于它不会导致数组重新索引自身就地,因此由于count not而导致数组越界异常正在更新中。

通过向后遍历,可以避免越界异常。

【讨论】:

天哪……这真的很聪明。是的,我知道过滤方式会更迅速,但我认为这种方式更适用,会使用它。谢谢! hooray,一个 OP 的编辑,实际上提供了一个广受欢迎的答案,而不仅仅是为了增加代表而进行编辑。很少见。 @Unheiling - .reverse() 这个函数在 swift3 中不被支持。任何人都可以就同一问题提供更多帮助? 您应该删除for var i in (0..&lt;results.count).reverse() 中的var 关键字【参考方案4】:

如果你的循环继续...

for var i in (0..<results.count) where results.indices.contains(i)  

//if the index doesn't exist, the loop will be stopped.

if (results[i] < 5) 
        results.removeAtIndex(i) 
    


【讨论】:

以上是关于如何在 Swift 3 中为我在 for 循环期间修改的数组编写 for 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中从 for 循环中转义一行

Swift 3:如何使用 for 循环来循环数组

如何在 For 循环中为多个类别有条件地更新值

如何在c ++中为每个嵌套循环打印新列中的输出?

如何跳过for-in循环的迭代(Swift 3)

带有增量的 Swift 3 for 循环