objective-c更改for循环内的数组内容

时间:2012-06-20 14:11:55

标签: objective-c loops for-loop scope nsmutablearray

我有一个问题(我认为)可能与范围有关,但我不确定。我正在尝试做一些我认为应该简单的事情,但我得到一个奇怪的结果,我可以真正使用一些建议。我会说我是一个早期客观的程序员,但不是一个完整的新手。

我在objective-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

1 个答案:

答案 0 :(得分:0)

我认为问题在于:

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

由于这些东西几乎都在指针中工作(而不是复制内容),temp数组的每个元素都将指向dict字典,该字典设置为最新密钥的字典。我认为设置实际指针将解决问题。

dict = [temp objectAtIndex:x];