我正在使用类似于以下代码的基于 block 的枚举:
[[[rows objectForKey:self.company.coaTypeCode] objectForKey:statementType]
enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id coaItem, NSUInteger idx, BOOL *stop) {
// block code here
}]
我想在枚举过程中根据它们的对象值删除一些对象。
我该怎么做?我知道在枚举期间操作可变数组或字典(NSMutableArray 或 NSMutableDictionary)通常是不可能的。
实现这个的最佳方法是什么?
谢谢!
最佳答案
由于在枚举期间无法从数组或字典中删除对象,因此您必须累积要删除的项目,然后在枚举之后将其全部删除。
如果你正在处理一个数组,你可以只累加索引。:
NSMutableIndexSet *indexesToDelete = [NSMutableIndexSet indexSet];
NSUInteger currentIndex = 0;
for (id obj in yourArray) {
//do stuff with obj
if (shouldBeDeleted(obj)) {
[indexesToDelete addIndex:currentIndex];
}
currentIndex++;
}
[yourArray removeObjectsAtIndexes:indexesToDelete];
由于键在 NSDictionary 中的顺序是未定义的,对于 NSMutableDictionary 你将不得不累积键:
NSMutableArray *keysToDelete = [NSMutableArray array];
for (id obj in [yourDictionary keyEnumerator]) {
//do stuff with obj
if (shouldBeDeleted(obj)) {
[keysToDelete addObject:obj];
}
}
[yourDictionary removeObjectsForKeys:keysToDelete];
如果您使用 block 进行枚举,情况是一样的。在声明 block 的相同范围内声明枚举器,它将被保留并正常工作。
3 年前的这个问题也值得一看:Best way to remove from NSMutableArray while iterating? .
关于objective-c - 如何在枚举期间删除 NSMutableArray 或 NSMutableDictionary 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446254/