索引超出范围错误,自定义对象数组.迅速



当我从数组中删除对象时,我的索引超出范围错误。有我的代码。它是一个电梯功能,它采用楼层类的对象,并与该楼层的乘客类对象数组一起工作。我创建当前楼层对象的临时副本,然后沿着该副本的数组进行操作,如果对象适合条件,我们将此对象推送到乘客的电梯数组,并通过索引从当前楼层对象的原始数组中删除它。如果这很重要,我使用平等协议并创建了一个函数来比较。感谢您的任何回答。

class Passenger: Equatable{...}
func ==(l: Passenger, r: Passenger) -> Bool {
  return l === r
} 
func checkFloor(f: Floor){
    var tempFloor = f
    var pass = passengers
    for i in 0..<passengers.count {
        if(passengers.isEmpty){
            break
        }
        if(pass[i].getFloor()==f.getIdFloor()){
            f.peoples.append(pass[i])
            f.peoples[f.peoples.count - 1].setDirection(who: "nothing")
            //if var index = passengers.index(of: pass[i]) {
            if let index = searchInArray(who: passengers, who: pass[i]) {
                passengers.remove(at: index)
            }
        }
    }
    // in this part I have a problem 
    for i in 0..<tempFloor.countOf() { 
        if(f.peoples.isEmpty || passengers.count >= capacity){
            break
        }
        if(tempFloor.peoples[i].getDirection()==tempFloor.peoplesDirection() 
        ){
            passengers.append(tempFloor.peoples[i])
            if let index = f.peoples.index(of: tempFloor.peoples[i]) {
                  if (index >= 0 && index < f.peoples.count) {
                      //print(index)
                      f.peoples.remove(at: index)  // index out of range error
                  }
            }
        }
    }
}

您在枚举范围时正在删除项目,因此范围正在更改(可能经常更改(,但这不会更新for i in 0..<tempFloor.countOf()

从数组中删除项目时,该索引之后的每个项目都会更改其索引,并且计数会减少。 因此,如果您打算这样做,通常最好向后枚举数组,这样删除当前项目不会影响您接下来要做什么。

要演示,请在操场上尝试此代码

var arr = [1,2,3,4,5,6,7,8,9,10]
for (index, item) in arr.enumerated().reversed() {
    if item % 2 == 0 {
        arr.remove(at: index)
    }
}
print(arr)

它将向后迭代数组中的项目并删除任何偶数项,并将输出:

"[1, 3, 5, 7, 9]">

最新更新