2009-06-21 3 views
1

Учитывая NSMutableDictionary * dict, это плохой способ заменить ключи новым именем? Есть ли более простой способ?Переименование ключей в NSMutableDictionary

NSArray *originalField = [NSArray arrayWithObjects:@"oldkey", @"oldkey2", nil]; 

NSArray *replacedField = [NSArray arrayWithObjects:@"newkey", @"newkey2", nil]; 

for (int i=0; i<[originalField count]; ++i) 
{ 
    if ([dict objectForKey:[originalField objectAtIndex:i]] != nil) { 
     [dict setObject:[dict objectForKey:[originalField objectAtIndex:i]] forKey:[replacedField objectAtIndex:i]]; 
     [dict removeObjectForKey:[originalField objectAtIndex:i]]; 
    } 
} 

Спасибо!

+0

Поместите его в категорию для повторного использования. –

ответ

2

Нет, это в значительной степени. В общем, вы бы использовали быструю переписку и/или NSEnumerator для перемещения массивов вместо перехода по индексу, но поскольку вы идете по двум параллельным массивам, индексы - это самый лучший способ сделать это.

2

Это не плохой способ, но вы могли бы сделать его более изящным (и, на мой взгляд, проще), немного очистив код и устранив несколько избыточных вызовов метода. Поскольку @Peter предлагается, быстрое перечисление (вы можете использовать его на Leopard + или iPhone) было бы намного быстрее и чище, и поэтому в целом предпочтительнее. Вот пример:

NSArray *originalField = [NSArray arrayWithObjects:@"oldkey", @"oldkey2", nil]; 
NSArray *replacedField = [NSArray arrayWithObjects:@"newkey", @"newkey2", nil]; 
id anObject; 
NSEnumerator *replacementKeys = [replacedField objectEnumerator]; 
for (id originalKey in originalField) { 
    if ((anObject = [dict objectForKey:originalKey]) != nil) { 
     [dict removeObjectForKey:originalKey]; 
     [dict setObject:anObject forKey:[replacementKeys nextObject]]; 
    } 
} 

Одно примечание предупреждение: вы хотите, чтобы убедиться, что массивы originalField и replacedField имеют одинаковую длину. Если последнее короче, вы получите исключение, либо от -[NSEnumerator nextObject], либо от -[NSArray objectAtIndex:]. Если последнее длиннее, вы можете задаться вопросом, почему некоторые из ключей замены никогда не используются. Вы можете использовать NSAssert macro, чтобы убедиться, что во время отладки, и он будет автоматически отключен в сборках релизов.

В качестве альтернативы, если между ключами существует взаимно-однозначная связь, возможно, вы можете использовать словарь для сопоставления от старого ключа к новому ключу и перечислить результат -[NSDictionary allKeys].

Смежные вопросы