У меня проблема, которая (я думаю) может иметь отношение к области видимости, но я не уверен. Я пытаюсь сделать что-то, что, по-моему, должно быть простым, но я получаю странный результат, и я действительно мог бы использовать некоторые советы. Я бы сказал, что я программист с ранней целью-c, но не полный newb.object-c изменение содержимого массива внутри цикла
Я написал функцию в объективе-c, которую я хотел бы использовать для изменения имен ключей в изменяемом массиве изменяемых объектов словаря. Итак, я хочу передать изменчивый массив изменяемых объектов словаря и возвратить тот же измененный массив с теми же объектами словаря, но с некоторыми измененными именами ключей. Имеют смысл?
Я пробовал несколько операторов журнала в этом коде, которые, как представляется, показывают, что все, что я делаю, работает, за исключением случаев, когда цикл for завершен (когда я пытаюсь проверить значения в массиве temp), массив, как представляется, содержит только LAST-элемент в исходном массиве, повторяется [количество источников]. Как правило, это заставило бы меня поверить, что я неправильно пишу новые значения или не читаю их правильно, или даже что мои заявления NSLog не показывают мне, что я думаю. Но может ли это быть из-за сферы? Сохраняет ли массив не изменения вне цикла for?
Я положил много времени на эту функцию, и я исчерпал свою сумку трюков. Может ли кто-нибудь помочь?
-(NSMutableArray *)renameKeysIn:(NSMutableArray*)source {
/*
// Pre:
// The source array is an array of dictionary items.
// This method renames some of the keys in the dictionary elements, to make sorting easier later.
// - "source" is input, method returns a mutable array
*/
// copy of the source array
NSMutableArray *temp = [source mutableCopy];
// a temporary dictionary object:
NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
// These arrays are the old field names and the new names
NSMutableArray *originalField = [NSMutableArray arrayWithObjects:@"text", @"created_at",nil];
NSMutableArray *replacedField = [NSMutableArray arrayWithObjects:@"title", @"pubDate", nil];
// loop through the whole array
for (int x =0; x<[temp count]; x++) {
// set the temp dictionary to current element
[dict setDictionary:[temp objectAtIndex:x]];
// loop through the number of keys (fields) we want to replace (created_at, text)... defined in the "originalField" array
for (int i=0; i<[originalField count]; i++)
{
// look through the NSDictionary item (fields in the key list)
// if a key name in the dictionary matches one of the ones to be replaced, then replace it with the new one
if ([dict objectForKey:[originalField objectAtIndex:i]] != nil) {
// add a new key/val pair: the new key *name*, and the old key *value*
[dict setObject:[dict objectForKey:[originalField objectAtIndex:i]]
forKey:[replacedField objectAtIndex:i]];
// remove the old key/value pair
[dict removeObjectForKey:[originalField objectAtIndex:i]];
}// end if dictionary item not null
}// end loop through keys (created_at, text)
[temp replaceObjectAtIndex:x withObject:dict];
}// end loop through array
// check array contents
for (int a=0; a<[temp count]; a++){
NSLog(@"Temp contents: ############ %@",[[temp objectAtIndex:a] objectForKey:@"pubDate"]);
}
return temp;
} // end METHOD
Да, это было так, спасибо. Я должен был внести небольшое изменение - мне пришлось добавить «mutableCopy», потому что он разбился, как только я попытался изменить dict. Еще раз спасибо! – pereirap