2017-05-08 5 views
-2

配列からオブジェクトを削除すると、範囲外のインデックスのエラーが発生します。私のコードがあります。 Floorクラスのオブジェクトをとり、この階のPassengerクラスのオブジェクトの配列で動作するElevator関数です。現在の階のオブジェクトの一時的なコピーを作成し、このコピーの配列に沿って進み、オブジェクトが条件に適している場合、このオブジェクトを乗客のエレベータ配列にプッシュし、現在のフロアオブジェクトの元の配列からインデックスで削除します。これが重要な場合は、Equatableプロトコルを使用して比較する関数を作成します。 お返事ありがとうございます。インデックスの範囲外のエラー、カスタムオブジェクトの配列。 Swift

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

tempFloor.countOf()は、tempFloor.peoples.countを書き込むと同じです –

答えて

3

あなたは範囲を列挙しながらアイテムを削除しているので、範囲が変化している(潜在的に多くの場合)しかし、あなたは、配列から項目を削除すると、これは文句を言わないfor i in 0..<tempFloor.countOf()

を更新し、各項目は、そのインデックスを変更した後にそのインデックスとカウントが減少します。したがって、これを行う場合は、配列を逆方向に列挙することが最も一般的です。そのため、現在の項目を削除しても、次に行う操作には影響しません。 1 [」

:実証するために

は、それが逆方向に配列内の項目を反復してさえいることいずれかを削除します

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) 

遊び場にこのコードを試してみてください、とが出力されます、3、5、7、9] \ n "

+0

ありがとう –

関連する問題