从NSMutableArray中删除对象

时间:2010-05-30 16:04:35

标签: objective-c cocoa xcode calendar nsmutablearray

我有一个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 个答案:

答案 0 :(得分:7)

虽然您无法删除正在使用快速枚举的数组中的项目,但您有以下选项:

正如markhunte所指出的那样,-calendars并不一定会返回一个可变数组 - 你必须使用-mutableCopy来获得一个可以过滤的可变数组:

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

...或者例如-filteredArrayUsingPredicate:表示不可变的过滤副本。

NSArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars];
calendars = [calendars filteredArrayUsingPredicate:myPredicate];

答案 1 :(得分:4)

您无法更改您枚举的数组/列表(使用我所知的任何语言)。您需要创建第二个列表,将要添加的日历添加到。然后迭代第二个列表,从第一个列表中删除对象。然后,您可以处理第二个列表,只留下原始列表,只包含您希望保留的日历。

答案 2 :(得分:0)

我注意到NSMutableArray将从[[CalCalendarStore defaultCalendarStore] calendars]]中获得预期的结果。

但是[[CalCalendarStore defaultCalendarStore] calendars]]返回的数组实际上是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];

干杯。