Это не плохой способ, но вы могли бы сделать его более изящным (и, на мой взгляд, проще), немного очистив код и устранив несколько избыточных вызовов метода. Поскольку @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]
.
Поместите его в категорию для повторного использования. –