【问题标题】:NSMutableDictionary Adding multiple objects to one keyNSMutableDictionary 将多个对象添加到一个键
【发布时间】:2013-05-22 13:01:25
【问题描述】:

如何将多个对象添加到 NSMutableDictionary 中的同一个键? 我找不到正确的方法。 setObject 方法仅更新键数组中的单个对象。 NSMutableDictionary中的方法addObject: forkey:不可用,使用时会导致崩溃。

字典是从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!!!
    }
}

我还想更新新字典中的新分数,并且必须在相应的级别对象上更新它,也许是通过索引?

【问题讨论】:

  • 你定义好你的数据结构了吗?如果是这样,这个设计是什么样的?知道帮助您会容易得多。
  • 想一想:当你为同一个key设置了两个不同的对象后,当你要求objectForKey:时,你希望字典给你什么?

标签: objective-c nsmutabledictionary


【解决方案1】:

如果您想将多个对象存储在字典中的同一个键下,您唯一的机会是将它们放入一个

  • 数组
  • 其他词典
  • 设置
  • 您喜欢的任何收藏类型

并将其存储在您的字典中。 原因是,字典是键值对。整个体系结构并不是为了支持对应于多个对象的键。这些对象对于系统来说是无法区分的,因此没有骰子。

编辑: 如果您想使用索引访问对象,我想您最好的选择是 Array-Version。在字典中为键“昵称”存储一个可变数组,然后将对象添加到该数组中。 存储:

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

检索:

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

【讨论】:

    【解决方案2】:

    如果你的 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)
    

    【讨论】:

    • 我想使用 plist 文件来存储益智游戏的关卡分数。我用 NSUserdefaults 尝试了这个,它或多或少地使用相同的结构。我的问题:我是在正确的道路上,还是应该使用另一种方法来存储游戏数据?我对 xcode 很陌生,但我已经搜索了几个小时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多