在NSDictionary中更改密钥名称

时间:2011-04-12 08:17:37

标签: objective-c nsdictionary

我有一个方法,它返回一个带有某些键和值的nsdictionary。我需要将字典中的键名更改为新的键名,但该键的值必须相同,但我被困在这里。需要帮助

4 个答案:

答案 0 :(得分:7)

此方法仅适用于可变字典。如果新密钥已存在,它不会检查应该执行的操作。

你可以通过调用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];
    }
}

答案 1 :(得分:0)

您是否可以使用旧值添加新的键值对,然后删除旧的键值对?

这只适用于NSMutableDictionaryNSDictionarys一旦创建后就无法更改。

答案 2 :(得分:0)

您无法更改NSDictionary中的任何内容,因为它是只读的。

如何循环遍历字典并使用新的密钥名称创建新的NSMutableDictionary?

答案 3 :(得分:0)

要将特定键更改为新键,我已经为Category Class编写了一个递归方法。


- (NSMutableDictionary*)replaceKeyName:(NSString *)old_key with:(NSString )new_key {
    NSMutableDictionary dict = [NSMutableDictionary dictionaryWithDictionary: self];
    NSMutableArray *keys = [[dict allKeys] mutableCopy];
    for (NSString 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)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;
}