Удаление объекта из NSMutableArray
Я наткнулся на следующий ярлык в настройке цикла for (ярлык по сравнению с примерами учебников, которые я использовал):
for (Item *i in items){ ... }
В отличие от более длинного формата:
for (NSInteger i = 0; i < [items count]; i++){ ... } //think that right
Если я использую более короткую версию, есть ли способ удалить элемент, который в настоящее время повторяется (т.е. "i" )? Или мне нужно использовать более длинный формат?
Ответы
Ответ 1
Вы не можете удалить объекты из массива, а быстро перечислить его:
нумерация "безопасна" - перечислитель имеет мутацию, так что если вы попытка изменить коллекцию во время перечисления исключение поднят.
Во всяком случае, зачем вам менять контейнер, перечисляя его? Рассмотрите возможность хранения элементов, которые необходимо удалить, и удалите их из своего контейнера с помощью метода removeObjectsInArray:
или removeObjectsAtIndexes:
.
Ответ 2
Просто добавьте ключевое слово break;
после удаления элемента...
for(id item in items) {
if([item isEqual:itemToDelete]) {
[items removeObject:item];
break;
}
}
Ответ 3
Коллекция Objective-C не должна изменяться во время перечисления.
Вы можете использовать этот вариант для удаления объектов из коллекции:
for (NSInteger i = items.count - 1; i >= 0 ; i--) {
[items removeObjectAtIndex:i];
}
Ответ 4
Предыдущий цикл представляет собой цикл "для каждого" в Objective C.
* я является указателем на прямой элемент в элементах-массиве (в большинстве случаев это будет NSMutableArray).
Таким образом, вы можете напрямую работать с элементом:
[items removeObject: i];
Это (должно) работать - я в настоящее время не работаю на своем Mac и не могу проверить его.
Однако может быть, что Objective-C Предотвращает удаление объектов во время итерации по коллекции (что довольно часто встречается на большинстве языков).
Ответ 5
Я использую этот код для этого:
for (NSUInteger i = [items count] - 1; ; i--) {
[items removeObjectAtIndex:i];
}