我有一个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.

事情变糟了。显然,您似乎无法以这种方式做我想做的事情,所以有人可以建议最好的方法吗?

谢谢,

最佳答案

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


使用-filterUsingPredicate:过滤数组
使用基于索引的迭代
通过索引集删除,例如使用-indexesOfObjectsPassingTest:
建立要删除和使用的对象的数组,例如-removeObjectsInArray:


正如markhunte指出的,-calendars不必返回可变数组-您必须使用-mutableCopy来获取可以过滤的可变数组:

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


...或例如-filteredArrayUsingPredicate:获取不可变的过滤副本。

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

08-18 10:00