2

我尝试在我的数组中查找对象,如果成功,我需要将数组中的对象替换为新对象

 for (id existingSig in allSignature)
   if ([[existingSig objectForKey:@"SignatureName"] isEqualToString:[item objectForKey:@"name"]])
    {    
      [allSignature removeObject:existingSig];
      [allSignature addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"SignatureIsRich", [item objectForKey:@"name"], @"SignatureName", generatedID, @"SignatureUniqueId", nil]];
     }

我有错误“NSCFArray:0x100551f10> 在被枚举时发生了变异”

4

3 回答 3

4

正如其他人所说,您不能在枚举 MutableArray 时对其进行变异。您可以通过两个数组来处理它,其中包含循环后要删除的内容和添加的内容。

NSMutableArray *remove = [NSMutableArray array];
NSMutableArray *add = [NSMutableArray array];
for (id existingSig in allSignature){
   if ([[existingSig objectForKey:@"SignatureName"] isEqualToString:[item objectForKey:@"name"]])
    {    
      // Add to the array of objects to be removed
      [remove addObject:existingSig];
      // Add to the array of objects to be added
      [add addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"SignatureIsRich", [item objectForKey:@"name"], @"SignatureName", generatedID, @"SignatureUniqueId", nil]];
     }
}
[allSignature removeObjectsInArray:remove]; // Remove objects
[allSignature addObjectsFromArray:add]; // Add new objects
于 2012-05-05T00:37:25.803 回答
2

最简单的方法是制作一个副本并对其进行迭代,然后修改原始文件。

于 2012-05-04T23:55:47.963 回答
0

为此,我在 NSArray 类别中有一个映射数组方法

- (NSArray *) cw_mapArray:(id (^)(id obj))block
{
    NSMutableArray * cwArray = [[NSMutableArray alloc] init];
    [self cw_each:^(id obj, NSUInteger index, BOOL *stop) {
        id rObj = block(obj);
        if (rObj) {
            [cwArray addObject:rObj];
        }
    }];
    return cwArray;
}

这样我可以获得一个新数组,然后用新数组更改数组。您可以将 cw_each 更改为 enumerateObjectsUsingBlock:。基本上这很简单,如果您想将对象映射到新数组,您只需按原样返回块中的对象,否则修改它并返回它,或者如果您不想将对象映射到新数组然后返回零。它的代码不多,而且效果很好。

于 2012-05-05T01:26:37.807 回答