зацикливание массива и сохранение объектов в NSMutableDictionary не работает ??логическая проблема? - PullRequest
2 голосов
/ 29 ноября 2010

Кажется, у меня есть логическая проблема в этом цикле. Я пытаюсь:

  • Looping myKeys (из dict), чтобы найти выбранных игроков
  • Установка трех параметров BOOL для выбранных игроков (ДА или НЕТ) в NSMutableArray (thePlayers)
  • Обновление dict (selectedPlayerDict) с помощью 'thePlayers' и 'myKeys'
  • Очистить thePlayers и сделать новый цикл и то же самое

Отдельные игроки, когда я выбираю каждого игрока отдельно, имеют следующие параметры:

selectedPlayerDict: {Hannah = (0,0,1);}

selectedPlayerDict: { AAAXXX = ( 1, 1, 1 ); }

Когда выбрано и то, и другое, что означает включение (если ([theObjects objectAtIndex: 3] == [NSNumber numberWithBool: YES])), я получаю следующий результат с

selectedPlayerDict: { AAAXXX = ( 0, 0, 1, 1, 1, 1 ); Ханна = ( 0, 0, 1, 1, 1, 1 ); }

Для приведенного выше результата я использую:

// [thePlayers removeAllObjects]; // <<<<<<<<<<<<<<<<<<<<<<<<<< </p>

Когда я изменяю и удаляю комментарий "//":

[thePlayers removeAllObjects]; // <<<<<<<<<<<<<<<<<<<<<<<<<< </p>

Я получаю следующий результат:

selectedPlayerDict: { AAAXXX = ( ); Ханна = ( ); }

Код, который я использую:

for (NSString *myKeys in allTheKeys) {
    theObjects = [playerDict valueForKey:myKeys];

    if ([theObjects objectAtIndex:3] == [NSNumber numberWithBool:YES]) {

        //[thePlayers addObject:myKeys]; 

        NSLog(@"Spelare: %@ är vald", myKeys);
        NSLog(@">>>><<<<");

        // Check what difficulties level
        if ([theObjects objectAtIndex:0] == [NSNumber numberWithBool:YES]) { //hard
            NSLog(@"Player have diff HARD");
            [thePlayers addObject:[NSNumber numberWithBool:YES]]; //@"YES"];
        }
        else {
            NSLog(@"Player have NOT diff HARD");
            [thePlayers addObject:[NSNumber numberWithBool:NO]]; //@"NO"];
        }
        if ([theObjects objectAtIndex:1] == [NSNumber numberWithBool:YES]) { //medium
            NSLog(@"Player have diff MEDIUM");
            [thePlayers addObject:[NSNumber numberWithBool:YES]]; //@"YES"];
        }
        else {
            NSLog(@"Player have NOT diff MEDIUM");
            [thePlayers addObject:[NSNumber numberWithBool:NO]]; //@"NO"];
        }
        if ([theObjects objectAtIndex:2] == [NSNumber numberWithBool:YES]) { //easy
            NSLog(@"Player have diff EASY");
            [thePlayers addObject:[NSNumber numberWithBool:YES]]; //@"YES"];
        }
        else {
            NSLog(@"Player have NOT diff EASY");
            [thePlayers addObject:[NSNumber numberWithBool:NO]]; //@"NO"];
        }
        [selectedPlayerDict setValue:thePlayers forKey:myKeys];
        [thePlayers removeAllObjects];   //<<<<<<<<<<<<<<<<<<<<<<<<<<
    }

}
NSLog(@"selectedPlayerDict: %@", selectedPlayerDict);

Я знаю, что, возможно, я делаю что-то не так с логикой, но я пытался часами пытаться понять, что я делаю неправильно. Я не понимаю, почему объекты dic пустые, так как я являюсь «removeAllObjects» в массиве в конце цикла после того, как я обновил dict? Я пробовал "setObject: forKey:", но безуспешно.

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Другие ответы уже нашли источник вашей проблемы, но вот потенциальная другая проблема:

[theObjects objectAtIndex:2] == [NSNumber numberWithBool:YES]

Это работает, потому что [NSNumber numberWithBool:YES], вероятно, где-то кешируется, однако имейте в виду, что == сравнивает идентичность объекта, а не равенство объекта.Если вы знаете, что объекты в массиве theObjects являются объектами NSNumber, вы можете использовать boolValue:

if ([[theObjects objectAtIndex:2] boolValue])
   ...

Если вы не уверены, являются ли объекты в массиве NSNumberэкземпляры, вы можете использовать следующее:

if ([[theObjects objectAtIndex:2] isEqual:[NSNumber numberWithBool:YES]])
   ...
1 голос
/ 29 ноября 2010

Проблема в том, что вы повторно используете один и тот же массив для каждого ключа в selectedPlayerDict.Вам нужно будет создать новый массив для каждой итерации цикла;в противном случае removeAllObjects удаляет все объекты из одного массива, который является значением для каждого ключа в вашем словаре.

В качестве примечания, мне интересно, может ли enum {Easy, Medium, Hard}; удовлетворить ваши потребности лучше, чем 3BOOL с - что произойдет, если пользователь выберет> 1 из вариантов?

0 голосов
/ 29 ноября 2010

Вы очищаете массив, который вы только что добавили в словарь.

Попробуйте вместо этого:

NSArray* tempArray = [thePlayers copy];
[selectedPlayerDict setValue:tempArray forKey:myKeys];   
[tempArray release];
...