【问题标题】:Error getting valueForKey in an NSDictionary for key containing @ character在包含 @ 字符的键的 NSDictionary 中获取 valueForKey 时出错
【发布时间】:2012-10-28 23:35:57
【问题描述】:

我正在尝试在名为“robotDesign”的以下 NSDictionary 中获取“@type”键的值

robotDesign : {
    "@id" = "2";
    "@type" = "piggyDash";
    turnAngle = "-90";
    width = "90.0";
}

这是我使用的 JSON 对象的一部分

[NSJSONSerialization JSONObjectWithData: options: error:];

我正在使用以下代码提取@type 值

NSString * robot_type = (NSString*)[robotDesign valueForKey:@"@type"];

但收到以下错误:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因:'[<__nscfdictionary> valueForUndefinedKey:]: 这个 类不符合键类型的键值编码。'

注意:请注意,字典中的其他对象,如“turnAngle”和“width”,可以使用上面给出的相同代码轻松提取,但使用它们各自的键。

【问题讨论】:

  • 这就是为什么使用 valueForKey 而不是 objectForKey 是愚蠢的。最好的情况是,valueForKey 花费了无用的时间来确定它可以调用 objectForKey。最坏的情况,你得到垃圾。例如 valueForKey:@"@count" 将为您提供字典中键/值对的数量。

标签: objective-c ios cocoa-touch nsstring nsdictionary


【解决方案1】:

试试

NSString * robot_type = [robotDesign objectForKey:@"@type"];

或删除前导@

from the docs:

valueForKey:
返回与给定键关联的值。

- (id)valueForKey:(NSString *)key
参数 key 要为其返回相应值的键。请注意,在使用键值编码时, 键必须是字符串(参见“键值编码基础”)。

返回值
与键关联的值。

讨论 如果key不以“@”开头,则调用objectForKey:。如果 键确实以“@”开头,去掉“@”并调用 [super valueForKey:] 与其余的键。

@ 导致调用 NSDictionary 超类的valueForKey: 的实现。但是 NSObject 对密钥 type 一无所知。

【讨论】:

  • 感谢@viki 的回答。您在上面编写的代码行确实有效,但我不明白为什么。我确实在文档中阅读了上面提到的“讨论”,但我猜其中提到的@是“”之前的@而不是“”中的@。您能否解释一下,以便我可以将您的答案标记为正确。谢谢。
  • 虽然在objectForKey: 中,@ 只是字符串的一部分,但它在valueForKey: 中被解释为运算符,请查看苹果文档中的键值编码以了解它。
  • @vikingosegundo,一个小的更正。问题不在于NSObject 没有名为type 的键(属性);问题是NSDictionary 也没有。 NSDictionary 覆盖该方法的目的是为代码提供一种访问NSDictionary 属性的方法,该属性也是字典本身中的一个键。
【解决方案2】:

这是完美记录的行为。来自NSDictionary's class reference:

NSDictionary 覆盖 'valueForKey:' 方法。如果键以“@”字符开头,则调用 super,否则调用 objectForKey:

因此,除非您有正当理由不这样做,否则您应该使用- objectForKey:

【讨论】:

  • 是的,这是完美记录的行为。它也很容易掩盖行为,这就是 @shaffooo 遇到它的原因。
  • 感谢@H2CO3 的澄清。
  • 不,只使用objectForKey。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多