Objective c 在NSDictionary中获取包含@字符的键的valueForKey时出错
我正在尝试获取以下名为“robotDesign”的NSDictionary中“@type”键的值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 : {
"@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”将提供字典中键/值对的数量。