2013-05-22 2 views
5

Как добавить несколько объектов к одному ключу в NSMutableDictionary? Я не могу найти правильный метод. Метод setObject обновляет только один объект в массиве ключей. Метод addObject: forkey: в NSMutableDictionary недоступен и вызывает сбой при его использовании.NSMutableDictionary Добавление нескольких объектов к одному ключу

Словарь читается из файла plist.

Словарь:

temp = { 
    nickname : score 
     item 0 = level1; 
     item 1 = level2; 
     item 3 = level3; 
    score 
     item 0 = 400; 
     item 1 = 400; 
     item 3 = 400; 
} 

Вот код:

NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init]; 
str_nickname = [temp objectForKey:@"nickname"]; 
for (NSString *key in str_nickname){ 
    if ([key isEqualToString:@"level2"]) { //replace object with new name 
     [newDict setObject:@"new level" forKey:@"nickname"]; 
    } else { 
     [newDict addObject:key forKey:@"nickname"]; //wont work!!! 
    } 
} 

Кроме того, я хочу, чтобы обновить новый счет в новом словаре и должны обновлять их на соответствующем уровне-объекта, возможно, по индексу?

+0

Вы хорошо определили свои структуры данных? Если да, то как выглядит этот дизайн? Зная, что вам будет намного легче помочь. – Monolo

+1

Подумайте об этом: после того, как вы установили два разных объекта для одного и того же ключа, что вы хотите, чтобы словарь дал вам, когда вы запрашиваете 'objectForKey:'? –

ответ

1

если ваш файл PLIST, как это "test.plist"

The Dictionary temp={ 
    nickname : Junaid Sidhu 

    levels 
      item 0 = level1; 
      item 1 = level2; 
      item 3 = level3; 
    score 
      item 0 = 400; 
      item 1 = 400; 
      item 3 = 400; 
    } 

Вот код

NSDictionary *temp = [[NSDictionary alloc]initWithContentsOfFile:[NSBundle mainBundle] pathForResource:@"test" ofType:@"plist"]]; 

NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init]; 

NSString *str_nickname = [temp objectForKey:@"nickname"]; 
NSMutableArray *levels = [NSMutableArray new]; 
NSMutableArray *score = [NSMutableArray new]; 

for (NSString *key in [temp allKeys]){ 

    if ([key isEqualToString:@"levels"]) { //replace object with new name 

      levels = [NSMutableArray arrayWithArray:(NSArray *)[temp objectForKey:key]]; 

    } 
    else if ([key isEqualToString:@"score"]){ 

      score = [NSMutableArray arrayWithArray:(NSArray *)[temp objectForKey:key]]; 

    } 
} 

NSLog(@"Nick : %@ \n levels : %@ \n score : %@ \n",str_nickname,levels,score) 
+0

Я хочу использовать файл plist для хранения оценки уровня головоломки. Я пробовал это с NSUserdefaults, который работает более или менее с той же структурой. Мой вопрос: Am i на правильном пути, или я должен использовать другой метод для хранения игровых данных? Я довольно новый с xcode, но у меня есть поиск по часам –

+0

да вы можете использовать UserDefaults, но NSCoder является лучшим – junaidsidhu

+0

Спасибо JayD! –

2

, если вы хотите иметь несколько объектов, хранящихся под тем же ключом в словаре, ваш единственный шанс ставит их в

  • массива
  • другой словарь
  • набор
  • мешок
  • любой интересующий вас тип коллекций

a и сохраните это в своем словаре. Причина в том, что словари являются ключевыми ЦЕНАМИ. Вся архитектура не предназначена для поддержки ключа, который соответствует более чем одному объекту. Объекты были бы непостижимы для системы, и, следовательно, не играли в кости.

EDIT: Если вы хотите получить доступ к объекту с помощью индекса, я думаю, ваш лучший выбор - это Array-Version. Храните Mutable Array в словаре для ключевого «псевдонима», а затем добавьте объекты в этот массив. Сохранение:

[myDictionary setObject:[NSMutableArray array] ForKey:@"nickname"]; 
[[myDictionary objectForKey:@"nickname"] addObject:yourObject]; 

Чтобы получить:

[[myDictionary objectForKey:@"nickname"] objectAtIndex:index];