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没有更新而超出边界异常.
通过向后遍历,可以避免出界异常.
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方法可能是更好的主意.