如何在 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 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios 中为 UIScrollView 设置对齐方式

如何在 iOS Swift 3.1 Xcode 8.3.2 中为 iPad 应用程序安装 iPhone 应用程序

如何在我的精灵套件游戏 Swift 中为所有 iPhone 获得相同的布局尺寸

如何在cloudformation中为我的beantalk定义nodejs的版本

如何使用 Swift 动态访问数组中的项目

Swift 3 中的刮刮卡效果