19

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

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

这工作正常:

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

然而,这些都不起作用:

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

有任何想法吗?

谢谢,

麦克风

4

5 回答 5

21

如果要使用键值编码,则不应在键名中使用 @ 符号。

苹果的键名指南如下:

密钥必须使用 ASCII 编码,以小写字母开头,并且不得包含空格。

无论您从何处获取密钥,您都必须找到一种解决方法来重新格式化密钥字符串以符合 KVC。

于 2009-10-14T18:33:11.520 回答
13

只是为了稍微更新一下这个老问题......

这些原因:

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

...失败是关键路径中的任何“@”符号都被解释为集合的运算符,如下所示:

[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"]

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

于 2012-12-10T20:07:41.087 回答
2

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

于 2009-10-14T21:29:59.523 回答
0

我看到有两种方法

调酒

您可以调整valueForKeyPath开关NSDictionary以删除@符号,记住要考虑@sum,@average,...

如果您使用 Mantle,请覆盖

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

于 2015-04-27T04:50:05.267 回答
0

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

KVC 定义了如何命名对象的属性,以便 KVC 可以工作。NSDictionary 中的条目不是属性,也没有名称。NSDictionary 通过“假装”其条目的键就像字典的“属性”,为类似 KVC 的行为添加了一点魔力。

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

如果您不能强制字典键符合 KVC 支持的属性名称 - 打破您的键路径,并在有疑问的地方使用访问器。

我认为,这应该是最安全的方法。KVC 通常是一种能够缩短代码的“好东西”——但它不提供任何其他方式无法提供的功能(正如您自己演示的那样)。

于 2020-09-17T12:05:57.200 回答