-1

スコープに関係していると思われる問題がありますが、よくわかりません。私は単純であるべきだと思うことをしようとしていますが、奇妙な結果が得られており、本当にアドバイスを使用できます. 私は初期のオブジェクティブ C プログラマーだと思いますが、完全な初心者ではありません。

変更可能な辞書オブジェクトの変更可能な配列のキー名を変更するために使用したい関数をobjective-cで作成しました。したがって、変更可能な辞書オブジェクトの変更可能な配列を渡し、同じ辞書オブジェクトを含む同じ変更可能な配列を返しますが、キー名の一部が変更されます。わかる?

このコードでいくつかのログ ステートメントを試しましたが、for ループの実行が終了したとき (temp 配列の値をテストしようとしたとき) を除いて、私が行っていることはすべて機能していることを示しているようです。ソース配列の最後の要素のみ、[source count] 回繰り返されます。通常、これにより、新しい値を正しく記述していないか、正しく読み取っていないか、または 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
4

1 に答える 1

0

問題は次のとおりだと思います。

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

これらはほとんどすべて (コンテンツをコピーするのではなく) ポインターで機能するため、一時配列のすべての要素は、最新のキーの辞書が何であるかに設定されている dict 辞書を指します。実際のポインタを設定すると問題が解決すると思います。

dict = [temp objectAtIndex:x];
于 2012-06-20T14:23:06.710 に答える