如何通过有序的NSArray访问NSDictionary

时间:2010-07-19 20:36:58

标签: cocoa nsarray nsdictionary

所以我有一个NSDictionary包含多个具有属性的对象(键:值),但问题是我需要按特定顺序使用它们。

存储为NSArray是我想用作NSDictionary的键的对象列表。

我可以将NSArrayNSDictionary输出到控制台,但是当我通过以下方式访问键入“filename”的每个值时:

for(NSUInteger i=0; i<[images count]; i++)
NSLog(@"%@", [[dictionary objectForKey:[images objectAtIndex:i]] objectForKey:@"filename"]);

我得到所有空值。

任何人都有任何想法?我假设它是因为我的[images objectAtIndex:i]返回的不是字符串,但是我在(NSString *)中尝试了slappin并且我仍然得到空值。

2 个答案:

答案 0 :(得分:0)

如果字典中的内容不是字典,那么第二个objectForKey不应该是valueForKey吗?

答案 1 :(得分:0)

NSLog(@"%@", [[dictionary objectForKey:[images objectAtIndex:i]] objectForKey:@"filename"]);
     

我得到所有空值。

从数组中获取密钥工作正常。 dictionary没有您检索到的密钥的对象,或者您检索的字典没有密钥@"filename"的对象。

  

我假设是因为我的[images objectAtIndex:i]返回的不是字符串,但是我在(NSString *)中尝试了slappin并且我仍然得到空值。

首先,NSStrings不是唯一有效的密钥。任何可复制对象都可用作字典键。

更重要的是,请记住,您从不直接使用对象结构,而是使用指向对象的指针。 objectAtIndex:返回指向对象的指针;当你转换它的返回值时,你告诉编译器objectAtIndex:将返回一个指向NSString对象的指针。转换指针不会改变指针本身;它只告诉编译器在该指针的另一端会发生什么。如果objectAtIndex: 返回指向Foo对象的指针,那么将它们转换为指向NSString对象的指针将不会使它们指向NSString对象;它们仍将指向Foo对象,因此在键是字符串的字典中查找这些对象仍然会失败。

另一件要考虑的事情是:你为什么不知道这个数组中有什么?你创建了数组。您填充了数组。当然,你应该知道它里面有什么。 objectAtIndex:除了(指向)数组中的对象之外不返回任何内容。

如果您认为objectAtIndex:返回的对象不是有效键,那么您应该使用NSLog或调试器来检查数组。检查数组包含的内容以及这些对象的类。

更可能的情况是,数组确实包含有效作为键的对象,但它们不是字典中的键,或者它包含字典中键的对象,但作为这些键的对象的字典不包含包含@"filename"键。检查数组和外部字典。

另一个警告,这可能是你绊倒的:如果你在数组中保留可变字符串,那些键是你最初将字典插入到外部字典下面,而你改变这些字符串,使它们与外部字典中的键不匹配。请记住,字典复制其密钥(这就是密钥需要可复制的原因);你改变了你在数组中的字符串,但字典先前制作了一个副本,并且该副本不会改变。 (这是制作副本的重点:无论是谁制作副本 - 在这种情况下,字典 - 都希望保持对象不变,而不接收以后发生的任何突变。)

因此,如果要修改任何字符串,则必须在数组中替换它们,并在新键下存储旧字典的外部字典对象。您还必须采取措施防止重复密钥;字典只能为每个键保存一个对象,而数组可以包含任意次数的同一个对象。