2012-06-20 3 views
0

У меня проблема, которая (я думаю) может иметь отношение к области видимости, но я не уверен. Я пытаюсь сделать что-то, что, по-моему, должно быть простым, но я получаю странный результат, и я действительно мог бы использовать некоторые советы. Я бы сказал, что я программист с ранней целью-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 

ответ

0

Я думаю, что вопрос находится на линии с:

[dict setDictionary:[temp objectAtIndex:x]]; 

Поскольку эти вещи почти все работают в указателей (вместо копирования содержимого), каждый элемент вашего массива темп будет указывать на dict, который установлен как словарь последнего ключа. Я думаю, что установка фактического указателя решит проблему.

dict = [temp objectAtIndex:x]; 
+0

Да, это было так, спасибо. Я должен был внести небольшое изменение - мне пришлось добавить «mutableCopy», потому что он разбился, как только я попытался изменить dict. Еще раз спасибо! – pereirap

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