我有一个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.
事情变坏了。显然你似乎不能做我想做的事情所以有人能建议最好的办法吗?
谢谢,
答案 0 :(得分:7)
虽然您无法删除正在使用快速枚举的数组中的项目,但您有以下选项:
-filterUsingPredicate:
-indexesOfObjectsPassingTest:
-removeObjectsInArray:
正如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];
干杯。