Objective c 在NSDictionary中获取包含@字符的键的valueForKey时出错

Objective c 在NSDictionary中获取包含@字符的键的valueForKey时出错,objective-c,ios,cocoa-touch,nsstring,nsdictionary,Objective C,Ios,Cocoa Touch,Nsstring,Nsdictionary,我正在尝试获取以下名为“robotDesign”的NSDictionary中“@type”键的值 robotDesign : { "@id" = "2"; "@type" = "piggyDash"; turnAngle = "-90"; width = "90.0"; } 这是我使用的JSON对象的一部分 [NSJSONSerialization JSONObjectWithData: options: error:]; 我使用以下代码来提取@type值 N

我正在尝试获取以下名为“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”而终止应用程序, 原因:'[valueForUndefinedKey:]:此 类与键类型的键值编码不兼容。'

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

试试看

NSString * robot_type = [robotDesign objectForKey:@"@type"];
或删除前导的
@

valueForKey:

返回与给定键关联的值

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

返回值
与键关联的值

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


@
导致调用NSDictionary超类的
valueForKey:
实现。但是NSObject不知道任何关于键
类型的信息

这是一个完美的记录行为。从

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


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

是的,这是一种完全记录在案的行为。它也很容易掩盖行为,这就是@shaffooo遇到它的原因。感谢@H2CO3的澄清。不,只需使用objectForKey。感谢@viki的回答。你上面写的代码行确实有效,但我不明白为什么。我确实在文件中阅读了上述“讨论”,但我猜其中提到的@是“中”之前的@,而不是“中”的@。你能解释一下吗?这样我就可以把你的答案记对了。谢谢。虽然在
objectForKey:
@中,它只是字符串的一部分,但在
valueForKey:
中,它被解释为一个运算符,请查看Apple文档中的键值编码以了解它。@vikingosegundo,一个小的更正。问题不在于
NSObject
没有名为
type
的键(属性);问题是
NSDictionary
也没有。
NSDictionary
重写该方法的目的是为代码提供一种访问
NSDictionary
属性的方法,该属性也是字典本身的一个键。这就是为什么使用valueForKey而不是objectForKey是愚蠢的。最好的情况是,valueForKey花费了无用的时间来找出它可以调用objectForKey。最坏的情况是,你得到的是垃圾。例如valueForKey:@“@count”将提供字典中键/值对的数量。