在包含@字符的密钥的NSDictionary中获取valueForKey时出错

sha*_*ooo 6 cocoa-touch objective-c nsdictionary nsstring ios

我试图在以下名为'robotDesign'的NSDictionary中获取"@type"键的值

robotDesign : {
    "@id" = "2";
    "@type" = "piggyDash";
    turnAngle = "-90";
    width = "90.0";
}
Run Code Online (Sandbox Code Playgroud)

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

[NSJSONSerialization JSONObjectWithData: options: error:];
Run Code Online (Sandbox Code Playgroud)

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

NSString * robot_type = (NSString*)[robotDesign valueForKey:@"@type"];
Run Code Online (Sandbox Code Playgroud)

但是请注意以下错误:

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[<__ NSCFDictionary 0x71de9e0> valueForUndefinedKey:]:此类不是密钥类型的密钥值编码兼容.

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

Vik*_*ica 13

尝试

NSString * robot_type = [robotDesign objectForKey:@"@type"];
Run Code Online (Sandbox Code Playgroud)

或删除前导 @

来自文档:

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

- (id)valueForKey:(NSString *)key
参数 key用于返回相应值的键.请注意,使用键值编码时,键必须是字符串(请参阅"键值编码基础").

返回值
与键关联的值.

讨论如果key不以"@"开头,则调用objectForKey:.如果key以"@"开头,则删除"@"并使用其余键调用[super valueForKey:].

@引线调用的执行valueForKey:的NSDictionary的超类的.但NSObject对密钥一无所知type.


小智 6

这是完全记录的行为.来自NSDictionary的类参考:

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

所以,除非你有正当理由不这样做,否则你应该使用- objectForKey:.