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 № 1Nã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]
.