Как переименовать ключ в NSMutableDictionary? - PullRequest
11 голосов
/ 02 февраля 2011

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

Как я могу это сделать?Есть ли встроенный API для этого?

Спасибо всем ..

Ответы [ 5 ]

38 голосов
/ 02 февраля 2011
// assumes that olkdey and newkey won't be the same; they can't as
// constants... but...
[dict setObject: [dict objectForKey: @"oldkey"] forKey: @"newkey"];
[dict removeObjectForKey: @"oldkey"];
<Ч />

Подумайте, что означает «непосредственное редактирование существующего ключа». Словарь - это хеш; он хэширует содержимое ключей, чтобы найти значение.

Что произойдет, если вы измените содержимое ключа? Ключ должен быть перефразирован (и внутренняя структура словаря перебалансирована), иначе значение больше не будет доступным.

Почему вы хотите редактировать содержимое ключа? То есть Какую проблему это решить, что выше не делает?

9 голосов
/ 02 февраля 2011

Это должно работать:

- (void) renameKey:(id<NSCopying>)oldKey toKey:(id<NSCopying>)newKey{
    NSObject *object = [dictionary objectForKey:oldKey];
    [object retain];
    [dictionary removeObjectForKey:oldKey];
    [dictionary setObject:object forKey:newKey];
    [object release];
}

Это точно так же, как ответ bbum, но, если вы сначала удалите старый ключ (как в этом примере), то вам придется временно сохранить объект, в противном случае он можетполучить освобождение путём;)

Вывод: Если вам не нужно явно удалить старый ключ, сначала сделайте как bbum.

5 голосов
/ 02 февраля 2011
@interface NSMutableDictionary (KAKeyRenaming)
- (void)ka_replaceKey:(id)oldKey withKey:(id)newKey;
@end

@implementation NSMutableDictionary (KAKeyRenaming)
- (void)ka_replaceKey:(id)oldKey withKey:(id)newKey
{
    id value = [self objectForKey:oldKey];
    if (value) {
        [self setObject:value forKey:newKey];
        [self removeObjectForKey:oldKey];
    }
}
@end

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

3 голосов
/ 02 февраля 2011

Вы пробовали эту ссылку

Могу ли я изменить ключ NSDictionaries?

0 голосов
/ 03 октября 2017

Мне нужно перемещаться по полному объекту ответа JSON, который содержит поля, под-словари и под-массивы.Все потому, что одно из полей JSON называется return, которое является зарезервированным словом iOS, поэтому его нельзя использовать с JSONModel Cocoa Pod .Вот код:

+ (id) sanitizeJSON:(id) dictIn {
if (dictIn) //check not null
{
    // if it's a dictionary item
    if ([dictIn isKindOfClass:[NSDictionary class]])
    {
        NSMutableDictionary *dictOut = [dictIn mutableCopy]; 
        // Do the fix replace "return" with "not_return"
        if ([dictOut objectForKey: @"return"])
        {[dictOut setObject: [dictIn objectForKey: @"return"] forKey: @"not_return"];
         [dictOut removeObjectForKey: @"return"];}

        // Continue the recursive walk through
        NSArray*keys=[dictOut allKeys]; //get all the keys
        for (int n=0;n<keys.count;n++)
        {
           NSString *key = [keys objectAtIndex:n];
           //NSLog(@"key=%@ value=%@", key, [dictOut objectForKey:key]);
           if (([[dictOut objectForKey:key] isKindOfClass:[NSDictionary class]]) || ([[dictOut objectForKey:key] isKindOfClass:[NSArray class]]))
            {
                // recursive call
                id sanitizedObject =  [self sanitizeJSON:[dictOut objectForKey:key]];
                [dictOut removeObjectForKey: key];
                [dictOut setObject:sanitizedObject forKey:key];
                // replace returned (poss modified) item with this one
            }
        }
        return dictOut; //return dict
    }
    else if ([dictIn isKindOfClass:[NSArray class]]) //Or if it's an array item
    {

        NSMutableArray *tempArray = [dictIn mutableCopy];
        // Do the recursive walk across the array
        for (int n=0;n< tempArray.count; n++)
        {
            // if array item is dictionary
            if (([[tempArray objectAtIndex:n] isKindOfClass:[NSDictionary class]]) || ([[tempArray objectAtIndex:n] isKindOfClass:[NSArray class]]))
            {
                // recursive call
                id sanitizedObject =  [self sanitizeJSON:[tempArray objectAtIndex:n]];
                // replace with the possibly modified item
                [tempArray replaceObjectAtIndex:n withObject:sanitizedObject];
            }
        }
        return tempArray; //return array
    }
    return dictIn; //Not nil or dict or array
}
else
  return dictIn; //return nil 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...