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