【问题标题】:how to access an NSDictionary through an ordered NSArray如何通过有序的 NSArray 访问 NSDictionary
【发布时间】:2010-07-19 20:36:57
【问题描述】:

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

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

我可以将NSArrayNSDictionary 输出到控制台,但是当我访问每个键入“文件名”的值时:

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

我得到所有空值。

有人知道吗?我假设这是因为我的 [images objectAtIndex:i] 返回的不是字符串,但是我已经尝试在 (NSString *) 中进行 slappin,但我仍然得到空值。

【问题讨论】:

  • 感谢您的编辑,skaffman - 但我很好奇您编辑了什么!编辑:我假设你添加了可可标签,谢谢!

标签: cocoa nsarray nsdictionary


【解决方案1】:

如果字典里的东西不是字典,那第二个objectForKey不应该是valueForKey吗?

【讨论】:

  • 如果它们不是字典,那么它们将不会响应objectForKey:,因此代码将在第一次迭代中停止并出现异常;提问者不会看到一系列nils。
【解决方案2】:
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" 键。检查数组和外部字典。

另一个警告,这可能是什么让你绊倒:如果你在数组中保留 mutable 字符串,这些是你最初将字典插入到外部字典中的键,而你改变这些字符串,使它们与外部字典中的键不匹配。请记住,字典会复制它们的键(这就是键需要可复制的原因);你改变了你在数组中的字符串,但是字典之前做了一个副本,并且那个副本没有改变。 (这就是制作副本的意义:制作副本的人(在本例中为字典)希望保持对象原样,而不会收到以后发生的任何突变。)

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

【讨论】:

  • 哇,谢谢伙计 - 在输入问题时,我确实意识到我对 NSDictionaries 有更多的了解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2014-06-13
  • 1970-01-01
相关资源
最近更新 更多