我想在valueForKeyPath
上使用NSDictionary
,但问题是其中一个键是以@符号开头的字符串。我无法控制密钥的命名。
我在尝试创建密钥路径时遇到问题,因为即使在尝试转义@符号时,我也会遇到格式异常:
这很好用:
[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]
然而,这些都不起作用:
[dict valueForKeyPath:@"key1.@specialKey.key3"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]
有什么想法吗?
谢谢,
麦克
答案 0 :(得分:20)
如果要使用键值编码,则不应使用带有键名的@符号。
关键名称的键必须使用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是一种“精妙的”功能,能够缩短您的代码-但它不提供您原本无法拥有的任何功能(如您所展示的那样)。