2011-12-22 8 views
0

インデックス0, 1 ... n-1にn個の要素を含むNSArrayがあります。 NSDictionaryに配列の内容を設定したいとします。NSArrayからNSDictionaryを作成する(Objective-c 2.0)

特に、辞書にはキーと値のペアが含まれている必要があります。ここで、キーは配列内のi番目の要素のハッシュで、値は配列へのインデックスです。例えば

array = [123, 101, 199]その後、辞書が3キーと値のペアが含まれます:私は以上のforループでこれをやった

  • ([123 hash], 0)
  • ([199 hash], 2)
  • ([101 hash], 1)

を配列。 これを行うためのより簡潔な方法は何ですか?おそらくNSKeyValueCodingの何か?

詳細情報:私はこのような何かを考えています:

NSArray *keys = [myArray valueForKey:@"hash"]; 
NSArray *values = [myArray valueForKey:@"index"]; // @"index" needs to change 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:values 
                 forKeys:keys]; 
+1

forループは非常に簡潔です。わずかに異なる見た目のバージョンで使用できる構文はいくつかありますが、実際にはほぼ同じ量のコードで同じことをやっています。 –

+0

あなたは正しいのですが、ループはほんの数行です。私はちょうどNSKeyValueEncodingについて学びたいと思います。 – SundayMonday

+0

ああ、別の質問で明示的に質問することができます。 KVC(KeyValueCoding)は、あなたがここでやっていることとは一種の直交性です。あなたがこの質問で話している問題については、ループ(またはそのいとこの1つ)が正しい方法です。 –

答えて

1

私はおそらく自分Davidのforループソリューションのようなものを使用していますが、ちょうど蹴りのために、と私はまだ完全にそれらのまわりで私の頭をラップしようとしているためだろう、私はblocksを使用して解決策を考え出した:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:[array count]]; 

[array enumerateObjectsUsingBlock:^ (id obj, NSUInteger idx, BOOL *stop) { 
    [dict setObject:[NSNumber numberWithUnsignedLong:idx] forKey:hashFor(obj)]; } ]; 

私は、ハッシュを生成する関数hashForの存在を前提としています。その部分を、objなどのメッセージで置き換えたり、ハッシュを生成するために何をしてもかまいません。

1

forループAは、インデックスを必要とする場合は特に、かなり良いです。それ以外の場合は、高速列挙を使用することができます。

int i = 0; 
for (object in array) { 
    … [NSNumber numberWithInt: i] … // Add to dict 
    i++; 
} 

これはKVCとは関係ありません。

関連する問題