Удаление объекта из NSMutableArray - PullRequest
15 голосов
/ 03 мая 2010

Я наткнулся на следующий ярлык при настройке цикла for (ярлык по сравнению с примерами из учебников, которые я использовал):

for (Item *i in items){ ... }

В отличие от более длинного формата:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right

Если я использую более короткую версию, есть ли способ удалить элемент, который в данный момент повторяется (т. Е. 'I')? Или мне нужно использовать более длинный формат?

Ответы [ 5 ]

31 голосов
/ 03 мая 2010

Вы не можете удалять объекты из массива при быстром перечислении it:

нумерация «безопасна» - счетчик имеет защиту от мутаций, так что если вы попытка изменить коллекцию во время перечисления исключение поднял.

В любом случае, зачем вам менять контейнер при его перечислении? Рассмотрите возможность хранения элементов, которые необходимо удалить, и удалите их из контейнера, используя метод removeObjectsInArray: или removeObjectsAtIndexes:.

9 голосов
/ 13 октября 2011

Просто добавьте ключевое слово break; после удаления элемента ...

for(id item in items) {
    if([item isEqual:itemToDelete]) {
        [items removeObject:item];
        break;
    }
}
3 голосов
/ 03 сентября 2015

Коллекция Objective C не должна быть изменена во время перечисления.

Вы можете использовать этот вариант для удаления объектов из коллекции:

for (NSInteger i = items.count - 1; i >= 0 ; i--) {
   [items removeObjectAtIndex:i];
}
1 голос
/ 03 мая 2010

Прежний цикл - это цикл "для каждого" в Objective C.

* i - указатель на прямой элемент в массиве элементов (в большинстве случаев это будет NSMutableArray).

Таким образом, вы можете работать непосредственно с предметом:

[items removeObject: i];

Это (должно) сработать - в настоящее время я не работаю на своем Mac и не могу его проверить. Однако, возможно, Objective-C предотвращает удаление объектов во время итерации по коллекции (что довольно часто встречается в большинстве языков).

0 голосов
/ 05 октября 2015

Я использую этот код для этого:

for (NSUInteger i = [items count] - 1; ; i--) {
     [items removeObjectAtIndex:i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...