objective-c - 如何在枚举期间删除 NSMutableArray 或 NSMutableDictionary 中的元素?

标签 objective-c ios nsmutablearray objective-c-blocks nsmutabledictionary

我正在使用类似于以下代码的基于 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/

相关文章:

java | Json 字符串到对象(无需库)

ios - NSURLSession 中的 "Type of expression is ambiguous without more context"

swift - 使用谓词搜索对象的 NSMutableArray

objective-c - Objective-C - 矩阵乘法性能低下

ios - 应用程序崩溃 : Mutating method sent to immutable object

iphone - SQLite3 数据库未通过 NSLog 在控制台上显示条目(将数据保存到数据库有效)

objective-c - iOS 设备上的钥匙串(keychain)可以保存与 NSString 不同的东西吗?

objective-c - 视网膜 iPad 上的非视网膜图像

iphone - 如何隐藏 UITableViewCell 附件披露指示器

ios - Alamofire 响应回调中的委托(delegate)为 nil