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を変更することはできません。ループの後に削除するものと追加するものの2つの配列を用意することで、これを処理できます。

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:に変更できます。基本的にこれは簡単です。オブジェクトを新しい配列にマップする場合は、ブロック内のオブジェクトをそのまま返します。それ以外の場合は、オブジェクトを変更して返すか、オブジェクトを新しい配列にマップしない場合は、 nil。それはあまりコードではなく、素晴らしく機能します。

于 2012-05-05T01:26:37.807 に答える