Удаление объекта от NSMutableArray

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

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

В противоположность более длинному формату:

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

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

16
задан Ben Packard 9 December 2014 в 14:24
поделиться

2 ответа

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

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

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

31
ответ дан 30 November 2019 в 15:51
поделиться

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

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

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

[items removeObject: i];

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

1
ответ дан 30 November 2019 в 15:51
поделиться