【问题标题】:NSMutableDictionary with single key holding many values in Objective-C programmingNSMutableDictionary,在 Objective-C 编程中,单键保存多个值
【发布时间】:2010-08-09 06:53:30
【问题描述】:

请告诉我如何在 NSMutableDictionary 中为同一个键设置多个值?

当我使用以下方法时,这些值将被替换为最近的值。

就我而言:

[dictionary setObject:forename forKey:[NSNumber numberWithint:code]];
[dictionary setObject:surname forKey:[NSNumber numberWithint:code]];
[dictionary setObject:reminderDate forKey:[NSNumber numberWithint:code]];

当我查看字典的内容时,我只得到reminderDate 的键码。在这里,所有值的代码都是相同的。如何避免名字和姓氏被plannedReminder替换。

谢谢!

【问题讨论】:

    标签: objective-c nsmutabledictionary


    【解决方案1】:

    您似乎正在使用code 作为键,并且您希望基于code 表示多个值。在这种情况下,您应该:

    1. 将与code 关联的所有数据抽象到一个单独的类(可能称为Person)中,并将该类的实例用作字典中的值。

    2. 使用多于一层的字典:

      NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
      
      NSMutableDictionary *firstOne = [NSMutableDictionary dictionary];
      [firstOne setObject:forename forKey:@"forename"];
      [firstOne setObject:surname forKey:@"surname"];
      [firstOne setObject:reminderDate forKey:@"reminderDate"];
      
      [dictionary setObject:firstOne forKey:[NSNumber numberWithInt:code]];
      
      // repeat for each entry.
      

    【讨论】:

    • 不要只是投反对票,让我知道哪里出了问题,以便我修复它!
    【解决方案2】:

    如果你真的坚持要在字典中存储对象,并且如果你正在处理字符串,你总是可以将所有字符串附加在一起,用逗号分隔,然后当你从键中检索对象时,你会让你的所有对象都采用准 csv 格式!然后,您可以轻松地将该字符串解析为对象数组。

    这里有一些你可以运行的示例代码:

    NSString *forename = @"forename";
    NSString *surname = @"surname";
    NSString *reminderDate = @"10/11/2012";
    NSString *code = @"code";
    
    NSString *dummy = [[NSString alloc] init];
    dummy = [dummy stringByAppendingString:forename];
    dummy = [dummy stringByAppendingString:@","];
    dummy = [dummy stringByAppendingString:surname];
    dummy = [dummy stringByAppendingString:@","];
    dummy = [dummy stringByAppendingString:reminderDate];
    dummy = [dummy stringByAppendingString:@","];
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setObject:dummy forKey:code];
    

    然后去检索并解析字典中的对象:

    NSString *fromDictionary = [dictionary objectForKey:code];
    NSArray *objectArray = [fromDictionary componentsSeparatedByString:@","];
    NSLog(@"object array: %@",objectArray);
    

    它可能不像dreamlax建议的那样干净,但是如果你正在处理一个字典,你想在其中存储一个键的数组并且该数组中的对象本身没有特定的键,这是解决方案!

    【讨论】:

    • 为什么不直接使用NSString *dummy = stringWithFormat:@"%@,%@,%@", forename, surname, reminderDate];。如果您以这种方式连接,至少应该使用NSMutableString
    【解决方案3】:

    我认为您不了解字典的工作原理。每个键只能有一个值。你会想要一个字典字典或数组字典。

    您在这里为每个人创建一个字典,然后将其存储在您的主字典中。

    NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
    forename, @"forename", surname, @"surname", @reminderDate, "@reminderDate", nil];
    
    [dictionary setObject:d forKey:[NSNumber numberWithint:code]];
    

    【讨论】:

      【解决方案4】:

      现代语法更简洁。

      A.如果您在加载时构建静态结构:

      NSDictionary* dic = @{code : @{@"forename" : forename, @"surname" : surnamem, @"reminderDate" : reminderDate}/*, ..more items..*/};
      

      B.如果您实时添加项目(可能):

      NSMutableDictionary* mDic = [[NSMutableDictionary alloc] init];
      [mDic setObject:@{@"forename" : forename, @"surname" : surnamem, @"reminderDate" : reminderDate} forKey:code];
      //..repeat
      

      然后你作为二维字典访问...

      mDic[code][@"forename"];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多