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

2020/12/16 04:11 · ios ·  · 0评论

因此,我有一个类似于以下内容的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

我该如何解决?它现在可以工作,但我不想将来遇到麻烦。

尽管使用解决方案filter是一个很好的解决方案,并且更快捷,但还有另一种方法,如果for-in仍然需要使用:

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)

结果:

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

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

removeAtIndex循环内的问题是,它不会导致数组重新就地索引自身,因此由于count未更新而导致数组超出范围异常

通过向后移动,可以避免超出范围的异常。

您可以改用一个filter吗?

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

如果要继续使用for-loop,可以使用枚举index和element enumerate

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

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

如果循环前进...

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) 
    }

}
本文地址:http://ios.askforanswer.com/ruhezaiswift-3zhongweizaiforxunhuanzhongxiugaideshuzubianxieforxunhuan.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!