如果一个键启动@符号,则在NSDictionary上使用valueForKeyPath?

时间:2009-10-14 17:39:47

标签: iphone objective-c nsdictionary key-value-coding

我想在valueForKeyPath上使用NSDictionary,但问题是其中一个键是以@符号开头的字符串。我无法控制密钥的命名。

我在尝试创建密钥路径时遇到问题,因为即使在尝试转义@符号时,我也会遇到格式异常:

这很好用:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]

然而,这些都不起作用:

[dict valueForKeyPath:@"key1.@specialKey.key3"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]

有什么想法吗?

谢谢,

麦克

5 个答案:

答案 0 :(得分:20)

如果要使用键值编码,则不应使用带有键名的@符号。

关键名称的

apple's guidelines如下:

  

键必须使用ASCII编码,开始   用小写字母,可能不是   包含空格。

您必须找到一种解决方法,以便在您获得密钥时重新格式化密钥字符串,以符合KVC标准。

答案 1 :(得分:13)

只是稍微更新这个老问题......

这些原因:

[dict valueForKeyPath:@"key1.@specialKey.key3"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]

...失败的是,密钥路径中的任何“@”符号都被解释为collection's operators,如下所示:

[dict valueForKeyPath:@"key1.@sum.key3"] // returns the sum of all 'key3' values
[dict valueForKeyPath:@"key1.@avg.key3"] // returns the average of all 'key3' values

嵌套键调用:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]

...工作,因为单个密钥不作为密钥路径处理。

答案 2 :(得分:1)

如果您无法控制命名,那么如何添加一个具有正确命名键的类别,只需返回/设置奇怪的键?

答案 3 :(得分:0)

我看到有两种方式

<强>拌和

您可以调动valueForKeyPath上的NSDictionary删除@符号,记得考虑@sum,@ sqrage,...

如果您使用地幔

,则覆盖

覆盖+ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary上的MTLJSONAdapter,遍历所有密钥并删除@符号

答案 4 :(得分:0)

以我的拙见,这里的整个讨论都以错误的方式通过关键路径访问NSDictionary中的条目-根本不是KVC协议的一部分。

KVC定义了如何命名对象的属性,以便KVC可以工作。 NSDictionary中的条目不是属性,并且没有名称。 NSDictionary通过“假装”其条目的键像字典的“属性”,将其神奇之处添加到了KVC式的行为中。

A,与字典键相比,属性具有不同的命名约定和限制。

如果您不能强制字典键与KVC支持的属性名称保持一致,请中断键路径,并在有疑问的地方使用访问器。

我认为那应该是最安全的方法。通常,KVC是一种“精妙的”功能,能够缩短您的代码-但它不提供您原本无法拥有的任何功能(如您所展示的那样)。