仅包含@ ist的NSString不符合Key Value

luk*_*lte 0 objective-c nsdictionary key-value key-value-coding ios

为什么NSString @"@"不符合关键值?还有其他不符合要求的字符串吗?

您可以尝试使用此代码失败,例如:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"Some Object" forKey:@"@"];

NSString *theObject = [dict valueForKey:@"@"];
Run Code Online (Sandbox Code Playgroud)

将其设置为密钥是可以的,但不能查询该密钥.当然,您可以通过附加一些其他字符串来解决此错误,以后再删除另一个时间,例如在您想拥有密钥@时执行以下操作:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"Some Object" forKey:@"keyConst@"];

NSString *theObject = [dict valueForKey:@"keyConst@"];
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 6

setObject:forKey:objectForKey:(而不是valueForKey:)从字典中检索项目的对应物:

NSString *theObject = [dict objectForKey:@"@"];
Run Code Online (Sandbox Code Playgroud)

或者,使用"新"字典下标语法:

dict[@"@"] = @"Some Object";
NSString *theObject = dict[@"@"];
Run Code Online (Sandbox Code Playgroud)

valueForKey:如果密钥开头,则使用键值编码方法@.来自以下文件-[NSDictionary valueForKey:]:

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

例如,

NSString *x = [dict valueForKey:@"@description"];
Run Code Online (Sandbox Code Playgroud)

做同样的事

NSString *x = [dict description];
Run Code Online (Sandbox Code Playgroud)

所以在几乎所有情况下,objectForKey:除非你明确想要做一些Key-Value编码魔术,否则你应该使用它.