所以我有一个NSDictionary
包含多个具有属性的对象(键:值),但问题是我需要按特定顺序使用它们。
存储为NSArray
是我想用作NSDictionary
的键的对象列表。
我可以将NSArray
和NSDictionary
输出到控制台,但是当我通过以下方式访问键入“filename”的每个值时:
for(NSUInteger i=0; i<[images count]; i++)
NSLog(@"%@", [[dictionary objectForKey:[images objectAtIndex:i]] objectForKey:@"filename"]);
我得到所有空值。
任何人都有任何想法?我假设它是因为我的[images objectAtIndex:i]
返回的不是字符串,但是我在(NSString *
)中尝试了slappin并且我仍然得到空值。
答案 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"
键。检查数组和外部字典。
另一个警告,这可能是你绊倒的:如果你在数组中保留可变字符串,那些键是你最初将字典插入到外部字典下面,而你改变这些字符串,使它们与外部字典中的键不匹配。请记住,字典复制其密钥(这就是密钥需要可复制的原因);你改变了你在数组中的字符串,但字典先前制作了一个副本,并且该副本不会改变。 (这是制作副本的重点:无论是谁制作副本 - 在这种情况下,字典 - 都希望保持对象不变,而不接收以后发生的任何突变。)
因此,如果要修改任何字符串,则必须在数组中替换它们,并在新键下存储旧字典的外部字典对象。您还必须采取措施防止重复密钥;字典只能为每个键保存一个对象,而数组可以包含任意次数的同一个对象。