【问题标题】:NSDictionary keys with @ symbol带有 @ 符号的 NSDictionary 键
【发布时间】:2013-07-16 07:12:41
【问题描述】:

就像Using valueForKeyPath on NSDictionary if a key starts the @ symbol?之前在这里问过的一样

如果我必须将 NSDictionary 与“@ID”和“@Name”等键一起使用(服务器端限制,我无法控制命名),我该如何解决这个问题?现在,每次我尝试访问此类键时,应用程序都会崩溃。

【问题讨论】:

  • 我不完全确定你在做什么,你能显示出现问题的代码吗?

标签: ios objective-c nsdictionary


【解决方案1】:

如前所述,您不能这样做。转述Apple Docs reg。密钥格式 -

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

因此,尝试使用@.. 作为开始的键不会削减它。我建议您这样做 - 因为您无法更改后端发送密钥的方式,您可以控制这些密钥在 iOS 中的表示方式。因此,一旦您获得密钥,请删除起始 @ 符号并将字符串的其余部分作为密钥插入。由于@ 在所有键中都是不变的,因此从所有键中删除它们不应影响您的字典的基数。

【讨论】:

  • 谢谢,但是当我无法访问此密钥时如何删除它?当我打印 [MyDict allKeys] 应用程序也崩溃了。
  • 在填充 MyDict 之前处理您从服务器获得的密钥,然后用新密钥填充 MyDict... 清楚吗?
  • 是的,我会这样做的,谢谢。
  • @ItayAmza,我认为有办法处理你身边的情况。请检查我的答案。
  • 当@被用在键的开头时,我也遇到了这个问题——而不是在中间或结尾。显而易见的解决方案是在“@”上使用字符串替换,例如'(一种)'。当我试图用其他“奇数”字符、数字、大写或小写字母再次打破它时,我失败了。
【解决方案2】:

如果你用不规则键得到字典后尝试转换呢?

这个想法是这样的,是的,它是线程安全的

NSDictionary *_dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"value", @"@ID", @"value2", @"@Name", nil];

NSMutableDictionary *_mutableDictionary = [NSMutableDictionary dictionary];
NSLock *_lock = [[NSLock alloc] init];
[_dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    if ([_lock tryLock]) {
        NSString *_newKey = [key stringByReplacingOccurrencesOfString:@"@" withString:@""];
        [_mutableDictionary setValue:obj forKey:_newKey];
        [_lock unlock];
    }
}];

NSLog(@"ID : %@", [_mutableDictionary valueForKey:@"ID"]);
NSLog(@"Name : %@", [_mutableDictionary valueForKey:@"Name"]);

【讨论】:

  • @ItayAmza,任何时候,如果你觉得有用,请不要忘记标记它。 :)
  • 我还没有足够的声誉投票,我接受了@Srikar Appal 的回答,对不起。
  • @ItayAmza,太糟糕了。 :)
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多