当我从数组中删除对象时,我的索引超出范围错误。有我的代码。它是一个Elevator函数,它接受Floor类的对象,并在这个楼层使用Passenger类的对象数组。我创建了当前楼层对象的临时副本,然后我沿着这个副本的数组,如果对象适合条件,我们将此对象推送到Elevator乘客阵列,并通过索引从当前楼层对象的原始数组中删除它。如果这很重要,我使用Equatable协议并创建一个比较函数。 谢谢你的回答。
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
}
}
}
}
}
答案 0 :(得分:3)
您在枚举范围时删除了项目,因此范围正在发生变化(可能经常),但这不会更新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] \ n”