【问题标题】:NSDictionary inside NSDictionaryNSDictionary 里面的 NSDictionary
【发布时间】:2012-09-19 08:26:33
【问题描述】:

好的,我有一个 .plist 文件,

其中我有一个NSDictionary *StoredAddresses,

在StoredAddresses里面,是另外一把NSDictionary

我知道我可以使用,

if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"])

要访问顶级 NSDictionaries,但如何在存储的地址中搜索键?

【问题讨论】:

    标签: objective-c xcode key nsdictionary


    【解决方案1】:

    好吧,如果我没看错的话,你的字典中有字典。这就像任何其他对象一样工作:

    NSDictionary* Address=[dictionaryOfAddresses objectForKey:@"Home Address"];
    NSString* Street=[Address objectForKey:@"Street"];
    

    如果您愿意,可以合并调用:

    NSString* Street=[[dictionaryOfAddresses objectForKey:@"Home Address"] objectForKey:@"Street"];
    

    【讨论】:

    • 非常感谢,我想我什至可以在其中添加第三层?
    • 您可以根据需要添加任意数量的“层”。唯一重要的是你知道在每种情况下你得到什么对象。字符串和字典不是唯一的选择,你也可以有数组、日期或数字。字典只是“给定一个键,返回与之关联的值”。字典不关心键中存储了什么样的值。
    • 同样使用现代 Objective-C 语法,您可以使用 dictionaryOfAddresses[@"Home Address"][@"Street"] 代替。 :)
    【解决方案2】:

    您可以使用NSKeyValueCoding 方法valueForKeyPath: 访问嵌套对象的属性。例如,给定以下字典...

    NSDictionary *homeAddressDict = @{ @"street" : @"2 Elm St.", @"city" : @"Reston" };
    NSDictionary *addressesDict = @{ @"home" : homeAddressDict };
    

    ...您可以按如下方式访问嵌套的home 字典的值:

    NSString *street = [addressesDict valueForKeyPath:@"home.street"];
    NSString *city = [addressesDict valueForKeyPath:@"home.city"];
    

    这对于嵌套更深的路径同样适用,例如:

    NSDictionary *contactDict = @{ @"name" : @"Jim Ray", @"addresses" : addressesDict };
    
    NSString *street2 = [contactDict valueForKeyPath:@"addresses.home.street"];
    NSString *city2 = [contactDict valueForKeyPath:@"addresses.home.city"];
    

    请注意,无论对象是 NSDictionary 的实例还是从 NSObject 派生的任何自定义类,只要自定义类具有名称与键匹配的属性或实例变量,这将起作用。

    因此,例如,您可以替换自定义 Address 类的实例,而不是使用 NSDictionary 作为家庭地址,该类已声明属性、getter 方法或名为 street 的实例变量和 city(或名为 _street 和 _city 的实例变量),并且仍然以相同的方式访问它。

    如果包含目标属性的对象是可变的(例如NSMutableDictionary 的实例),您甚至可以使用相同的机制修改该值,例如:

    [contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];
    

    【讨论】:

      【解决方案3】:

      这将返回 StoredAddresses

      内的键数组
      yourArray=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] allKeys];
      

      然后您可以打印 yourArray 并查看密钥,然后在知道密钥后您可以使用任一方式访问

      dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:[yourArray objectAtIndex:index_for_that_key]];
      

      或

      dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:@"key_for_your_dict"];
      

      【讨论】:

        【解决方案4】:

        另一种获取子词典的新方法可以生成一些简洁的代码,是以下速记符号:

        NSString *street = dictionaryOfAddresses[@"HomeAddress"][@"Street"];
        

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多