/ / Renomeando chaves no NSMutableDictionary - cacau

Renomeando chaves no NSMutableDictionary - cacau

Dado um NSMutableDictionary * dict, esta é uma maneira ruim de substituir chaves por um novo nome? Existe um caminho mais fácil?

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]];
}
}

Obrigado!

Respostas:

2 para resposta № 1

Não, isso é muito bonito. Em geral, você usaria enumeração rápida e / ou NSEnumerator para percorrer as matrizes em vez de indexar por índice, mas como você está andando em duas matrizes paralelas, os índices são a maneira mais clara de fazê-lo.


2 para resposta № 2

Isso não é um mau maneira em si, mas você certamente poderia torná-lo mais elegante (e, na minha opinião, mais fácil), limpando o código um pouco e eliminando algumas chamadas de método redundantes. Como @Peter A enumeração rápida e sugerida (você pode usá-la no Leopard + ou no iPhone) seria muito mais rápida e mais limpa e, portanto, geralmente preferível. Aqui está um exemplo:

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]];
}
}

Uma nota de aviso: você vai querer ter certeza de que as matrizes originalField e replacedField são do mesmo tamanho. Se o último for mais curto, você receberá uma exceção, seja de -[NSEnumerator nextObject] ou -[NSArray objectAtIndex:]. Se o último for mais longo, você pode se perguntar por que algumas das chaves de substituição nunca são usadas. Você poderia usar um Macro NSAssert para verificar isso durante a depuração, e ele será desativado automaticamente nas compilações de lançamento.

Como alternativa, se houver realmente um relacionamento um-para-um entre as chaves, talvez você possa usar um dicionário para mapear da chave antiga para a nova chave e enumerar o resultado da chave. -[NSDictionary allKeys].