замена объектов в массиве при перечислении? - PullRequest
0 голосов
/ 18 мая 2011

Я отправляю обновление для моего приложения, которое потребует обновления пользовательских баз. Я храню данные в списке свойств. По сути, каждая точка в массиве - это NSMutableDictionaries, и мне нужно добавить ключи, заменить ключи и т. Д.

Я попытался сделать следующее, однако он генерирует исключение NSEx

for (NSMutableDictionary *dict in myArray) {

    if ([dict objectForKey:@"someKey"] == nil) {

        //Extract the value of the old key and remove the old key
        int oldValue = [[dict objectForKey:@"key1"] intValue];
        [dict removeObjectForKey:@"key1"];

        [dict setValue:[NSString stringWithFormat:@"%d pts", oldValue] forKey:@"newKey"];

        //Add new keys to dictionnary
        [dict setValue:@"some value" forKey:@"key2"];
        [dict setValue:@"some value" forKey:@"key3"];
        [dict setValue:@"some value" forKey:@"key4"];

        [self.myArray replaceObjectAtIndex:index withObject:dict];

    }

Что я должен сделать, чтобы обновить мои данные вышеуказанным способом?

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Проблема в том, что вы не можете изменить массив, который вы перебираете, с помощью быстрого перечисления.

Фрагмент кода вообще не нужен для этого вызова replaceObjectAtIndex:withObject:, поскольку вы заменяете объект тем же объектом! Так что, если вы удалите эту строку, все должно работать.

Как правило, вы можете избежать подобных проблем, если будете использовать обычный старый цикл for с индексированием, т.е.

for (int i = 0; i < [array count]; i++) {
    id obj = [array objectAtIndex:i];
    // ...
}

, поскольку это не приведет к быстрому перечислению.

1 голос
/ 04 апреля 2012

Создать копию массива и перечислить через копию.Таким образом, вы можете безопасно изменить исходное значение:

for (id obj in [NSArray arrayWithArray:entries]) {
    [entries removeObject:obj];
}

Не использовать:

for (int i = 0; i < [array count]; i++) {
    id obj = [array objectAtIndex:i];
    [array removeObject:obj];
}

Сделайте это потому, что после удаления индексы массива будут смещены!

0 голосов
/ 18 мая 2011

Сначала убедитесь, что myArray является NSMutableArray. Если это так, вы, вероятно, увидите некоторую ошибку, если отладите код, который говорит что-то вроде _NSArrayI unrecognized selector sent to instance _NSArrayI означает, что это неизменный массив Это очень раздражает, но попробуйте проверить это. Затем вы можете просто заменить myArray на mutableArray.

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self.myArray];
for (NSMutableDictionary *dict in mutableArray) {

if ([dict objectForKey:@"someKey"] == nil) {

    //Extract the value of the old key and remove the old key
    int oldValue = [[dict objectForKey:@"key1"] intValue];
    [dict removeObjectForKey:@"key1"];

    [dict setValue:[NSString stringWithFormat:@"%d pts", oldValue] forKey:@"newKey"];

    //Add new keys to dictionnary
    [dict setValue:@"some value" forKey:@"key2"];
    [dict setValue:@"some value" forKey:@"key3"];
    [dict setValue:@"some value" forKey:@"key4"];

    [mutableArray replaceObjectAtIndex:index withObject:dict];

}
}
...