изменение имени ключа в NSDictionary - PullRequest
5 голосов
/ 12 апреля 2011

У меня есть метод, который возвращает мне вопросник с определенными ключами и значениями. мне нужно изменить имена ключей из словаря на новое имя ключа, но значения должны быть одинаковыми для этого ключа, но я застрял здесь. нужна помощь

Ответы [ 4 ]

7 голосов
/ 12 апреля 2011

Этот метод будет работать только с изменяемым словарем. Он не проверяет, что должно быть сделано, если новый ключ уже существует.

Вы можете получить изменяемый словарь неизменяемого, вызвав для него mutableCopy.

- (void)exchangeKey:(NSString *)aKey withKey:(NSString *)aNewKey inMutableDictionary:(NSMutableDictionary *)aDict
{
    if (![aKey isEqualToString:aNewKey]) {
        id objectToPreserve = [aDict objectForKey:aKey];
        [aDict setObject:objectToPreserve forKey:aNewKey];
        [aDict removeObjectForKey:aKey];
    }
}
0 голосов
/ 25 января 2016

Чтобы заменить конкретный ключ на новый ключ, я написал рекурсивный метод для категории Class.

<code>
- (NSMutableDictionary*)replaceKeyName:(NSString *)old_key with:(NSString <em>)new_key {
    NSMutableDictionary</em> dict = [NSMutableDictionary dictionaryWithDictionary: self];
    NSMutableArray *keys = [[dict allKeys] mutableCopy];
    for (NSString <em>key in keys) {
        if ([key isEqualToString:old_key]) {
            id val = [self objectForKey:key];
            [dict removeObjectForKey:key];
            [dict setValue:val forKey:new_key];
            return dict;
        } else {
            const id object = [dict objectForKey: key];
            if ([object isKindOfClass:[NSDictionary class]]) {
                [dict setObject:[dict replaceKeyName:old_key with:new_key] forKey:key];
            } else if ([object isKindOfClass:[NSArray class]]){
                if (object && [(NSArray</em>)object count] > 0) {
                    NSMutableArray *arr_temp = [[NSMutableArray alloc] init];
                    for (NSDictionary *temp_dict in object) {
                        NSDictionary *temp = [temp_dict replaceKeyName:old_key with:new_key];
                        [arr_temp addObject:temp];
                    }
                    [dict setValue:arr_temp forKey:key];
                }
            }
        }
    }
    return dict;
}
0 голосов
/ 12 апреля 2011

Вы не можете ничего изменить в NSDictionary, так как это только для чтения.

Как насчет цикла по словарю и создания нового NSMutableDictionary с новыми именами ключей?

0 голосов
/ 12 апреля 2011

Не могли бы вы добавить новую пару ключ-значение, используя старое значение, а затем удалить старую пару ключ-значение?

Это будет работать только на NSMutableDictionary.NSDictionarys не предназначены для изменения после их создания.

...