2016-07-20 2 views
3

Я кодирую Swift, и смутитесь с одной проблемой. Я столкнулся с Индекс вне диапазона Ошибка, когда я пытаюсь удалить один элемент из массива во время перечисления массива.Как удалить элемент в массиве?

Вот мои коды ошибок:

 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 после удаления индекса 2, но Ваш индекс когда вы перечисляете значение счета 6 – Happiehappie

+0

, вы хотите удалить несколько элементов или один элемент? –

+0

Я хочу удалить элементы, если условие. – Kevin

ответ

4

Вы удаляете пункт в то же самое время, когда вы перечисляете же массив. Используйте фильтр вместо:

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

или для нескольких значений, используйте Set:

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

То же самое в одной строке:

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

спасибо. Я думаю, фильтр может справиться с этим. Но, я пробовал много раз ** для числа в массиве ** коды также могут реализовать это. Возможно, это означает, что он отличается от ** для (index, number) в array.enumerate() **. Я не уверен. – Kevin

+0

@noellee 'enumerate()' метод возвращает новую константную последовательность, которая будет одинаковой для всех итераций. Таким образом, в то время как вы удаляете элементы из оригинального 'array', количество элементов в этой последовательности остается неизменным, вызывая из-за уменьшения диапазона' array' в конце. С другой стороны, 'for number in array' использует' array' динамически, поэтому в этом случае нет проблем, но я думаю, что это плохое кодирование стиля. –

Смежные вопросы