如何在for循环中安全地从数组中删除项目?

nip*_*ese 10 arrays for-loop swift

完全透露,这是一个家庭作业问题:

它应该有[Circle]类型的私有属性.一系列圆圈.该方法应删除半径大于最小要求且小于最大要求的任何圆.

很明显,我应该使用removeAtIndex()删除不符合循环中确定的条件的数组项.然而,许多人已经指出在循环中删除项目的危险因为我猜是"迭代器/索引不匹配".

最终我最终创建了一个空数组并使用.append()将符合"良好"条件的值推送到filteredCircles数组,但我不禁感到这不符合赋值的标准.

有没有一个解决方案实际上从循环中删除数组中的项目?

Luc*_*tti 12

如果FOR LOOP没有强制性的(我没有看到在引用文本此要求),你应该使用的filter方法.

当您filter在一个数组上调用时,您将获得一个新数组,该数组仅包含与您传递给的闭包有关的值filter.原始数组未发生变异.

struct Circle {
    let radius: Double
}

let circles = [Circle(radius: 1), Circle(radius: 5.1), Circle(radius: 4), Circle(radius: 10.8)]

let bigCircles = circles.filter { $0.radius > 5 }
Run Code Online (Sandbox Code Playgroud)

为什么这种方法比在FOR LOOP中改变数组更好

  1. 由于circles是常量,因此您没有与多线程编程相关的问题.如果circles是可变的,那么其他线程可能会在您使用非常可怕的副作用进行循环时更改它.
  2. 不容易出错.您没有编写CPU应该执行的操作,而是描述结果应该如何.所以你和编译器之间的误解可能会减少:)
  3. 您编写的代码越少意味着潜在的错误越少.

这些是编写函数式编程代码的一些好处.