就像在使用 NSDictionary 上的 valueForKeyPath 之前问过的那样,如果键启动 @ 符号?
如果我必须将 NSDictionary 与“@ID”和“@Name”等键一起使用(服务器端限制,我无法控制命名)我该如何解决这个问题?现在,每当我尝试访问这种密钥时,该应用程序就会崩溃。
就像在使用 NSDictionary 上的 valueForKeyPath 之前问过的那样,如果键启动 @ 符号?
如果我必须将 NSDictionary 与“@ID”和“@Name”等键一起使用(服务器端限制,我无法控制命名)我该如何解决这个问题?现在,每当我尝试访问这种密钥时,该应用程序就会崩溃。
如前所述,您不能这样做。解释Apple Docs reg。密钥格式 -
密钥必须使用 ASCII 编码,以小写字母开头,并且不得包含空格。
因此,尝试使用@..
as start 的密钥不会削减它。我建议您这样做 - 因为您无法更改后端发送密钥的方式,您可以控制这些密钥在 iOS 中的表示方式。因此,一旦您获得密钥,请删除起始@
符号并将字符串的其余部分作为密钥插入。由于@
在所有键中都是恒定的,因此从所有键中删除它们不应影响您的 dict 的基数。
如果您在使用不规则键获得字典后尝试转换字典怎么办?
这个想法是这样的,是的,它是线程安全的:
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"]);