2016-07-20 2 views
3

스위프트으로 코딩 중이며 한 가지 문제가 있습니다. 배열의 열거 중에 배열에서 항목 하나를 제거하려고하면 색인 범위 오류가입니다. 여기Array에서 항목을 제거하는 방법?

내 오류 코드입니다 :

 var array :[Int] = [0,1,2,3,4,5] 
     for (index, number) in array.enumerate() { 
      if array[index] == 2 { 
       array.removeAtIndex(index) // Fatal error: Index out of range 
      } 
     } 

그 루프에 대한 각시 호출 할 수 없습니다 array.enumerate()을 의미합니까?

for number in array { 
     if number == 2 || number == 5 { 
      array.removeAtIndex(array.indexOf(number)!) 
     } 
    } 

또는

var index = 0 
repeat { 
    if array[index] == 2 || array[index] == 4 { 
     array.removeAtIndex(index) 
    } 
    index += 1 

} while(index < array.count) 
+1

당신의 수가 5이지만, 색인 열거 할 때 카운트 값이 6 – Happiehappie

+0

인 경우 여러 항목 또는 단일 항목을 제거 하시겠습니까? –

+0

조건과 일치하는 항목을 제거하고 싶습니다. – Kevin

답변

4

당신은 제거 할 항목을 같은 시간에 당신이 동일한 배열을 열거 할 때 :

나는 그렇게 내 코드를 변경해야합니다. 한 줄에

let unwantedValues: Set<Int> = [2, 4, 5] 
array = array.filter{!unwantedValues.contains($0)} 

같은 : 사용하는 대신 필터 :

var array: [Int] = [0,1,2,3,4,5] 
array = array.filter{$0 != 2} 

또는 여러 값을 사용 Set 인덱스 2를 제거한 후

array = array.filter{!Set([2, 4, 5]).contains($0)} 
+1

감사합니다. 필터가 처리 할 수 ​​있다고 생각합니다. 그러나 ** 배열의 숫자에 대해 ** 여러 번 시도했는데 ** 코드는 이것을 구현할 수도 있습니다. 아마도 array.enumerate() **에서 ** for (index, number)와 다른 것을 의미합니다. 나는 그것을 모른다. – Kevin

+0

@noellee'enumerate()'메소드는 모든 반복에 대해 동일한 새로운 상수 시퀀스를 반환합니다. 따라서 원래의 배열에서 요소를 제거하는 동안이 시퀀스의 요소 수는 변경되지 않고 끝에있는 배열의 범위가 축소됩니다. 반면에'for number in array'는'array'를 동적으로 사용하기 때문에이 경우 아무런 문제가 없지만 어쨌든 나쁜 스타일 코딩이라고 생각합니다. –

관련 문제