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

У меня есть NSMutableArray, который содержит все календари в моей системе (как CalCalendar объекты):

NSMutableArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars];

Я хочу удалить из calendars любые CalCalendar объекты, в заголовок которых не входит строка @"work".

Я пробовал это:

for (CalCalendar *cal in calendars) {
    // Look to see if this calendar's title contains "work". If not - remove it
    if ([[cal title] rangeOfString:@"work"].location == NSNotFound) {
        [calendars removeObject:cal];
    }
}

Консоль жалуется, что:

*** Collection <NSCFArray: 0x11660ccb0> was mutated while being enumerated.

И дела идут плохо. Очевидно, может показаться, что вы не можете делать то, что я хочу, и поэтому кто-нибудь может предложить лучший способ сделать это?

Спасибо

Ответы [ 3 ]

7 голосов
/ 30 мая 2010

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

  • отфильтровать массив, используя -filterUsingPredicate:
  • использовать основанную на индексе итерацию
  • удалить через наборы индексов, например, используя -indexesOfObjectsPassingTest:
  • создать массив объектов для удаления и использовать, например, -removeObjectsInArray:

Как отмечает markhunte, -calendars не обязательно возвращает изменяемый массив - вам нужно будет использовать -mutableCopy, чтобы получить изменяемый массив, который вы можете отфильтровать:

NSMutableArray *calendars = [[[[CalCalendarStore defaultCalendarStore] 
                                calendars] mutableCopy] autorelease];

... или, например, -filteredArrayUsingPredicate: для неизменной отфильтрованной копии.

NSArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars];
calendars = [calendars filteredArrayUsingPredicate:myPredicate];
4 голосов
/ 30 мая 2010

Вы не можете изменить массив / список, который вы перечисляете (на любом языке, который я знаю). Вам нужно будет создать второй список, в который вы будете добавлять календари, которые хотите удалить. Затем переберите второй список, удалив объекты из первого. Затем вы можете избавиться от второго списка, оставив только исходный список только с теми календарями, которые хотите сохранить.

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

Я заметил, что NSMutableArray выдаст ожидаемые результаты из [[CalCalendarStore defaultCalendarStore] календарей]].

Но возвращенный массив из [[CalCalendarStore defaultCalendarStore] календарей]] на самом деле является NSArray, а не NSMutableArray. (также появляется предупреждение об ожидаемой структуре)

Это все новое для меня, поэтому я что-то здесь упускаю? или это правильный способ выполнения этой задачи ..

NSMutableArray *workCals= [[NSMutableArray  alloc] initWithCapacity:2];
[workCals addObjectsFromArray: [[CalCalendarStore defaultCalendarStore] calendars]];


NSString *title = @"work";

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"title contains[c] %@",title ]; 
[workCals filterUsingPredicate:predicate];
NSLog(@"workCals %@",workCals );
[workCals release];

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...