2009-10-14 11 views
18

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

我在试图逃跑@符号问题时试图建立的关键路径,因为我得到一个格式异常,甚至:

这工作得很好:

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

但是这些都不工作:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

任何想法?

感谢,

迈克

+0

所以基本上你的字典objectForKey:@“KEY1”是NSDictionaryObject了。而那个字典objectForKey:@“key3” – 2012-10-03 10:58:05

回答

19

,如果你想使用键值编码,你不应该使用@你的键名的迹象。

apple's guidelines关键名称如下:

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

您必须找到解决方法来重新格式化密钥字符串,无论您将密钥从KVC兼容。

+0

啊,那好吧!我认为某种形式的转义需要发生,但是想到它,当然,以@开头的东西不能与KVC兼容!干杯! – 2009-10-14 18:37:25

+1

np。当您使用其他使用KVC的类和技术(如核心数据)时,它也会为您节省很多头痛的问题。 – pxl 2009-10-14 18:41:14

1

如果您无法控制命名,那么如何使用正确命名的密钥添加一个类别来简单地返回/设置奇怪的密钥?

+0

这是一个好主意。但考虑到KVC应该做什么,我不明白这是甚至是必要的。 KVC是一种惯例,可以一致地命名getter和setter,以便您可以访问属性。所以如果你不能用一个@符号来命名一个属性,那么你应该永远不会陷入它也是一个关键路径的一部分。 – pxl 2009-10-14 21:33:05

13

只是为了更新这个老问题有点......

的原因,这些:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

...失败是在关键路径上的任何“@”符号解释为collection's operators如:

[dict valueForKeyPath:@"[email protected]"] // returns the sum of all 'key3' values 
[dict valueForKeyPath:@"[email protected]"] // returns the average of all 'key3' values 

嵌套键拨打电话:

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

...因为单个密钥未作为关键路径处理而工作。

+0

谢谢!有效!!! – 2016-05-30 09:11:15

0

我看到有2种方式

调酒

可以调配的valueForKeyPathNSDictionary删除@符号,记住要占@sum,@average,...

覆盖,如果你在使用MTLJSONAdapter地幔

覆盖+ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary,遍历所有键和删除@符号

相关问题