web-dev-qa-db-ja.com

NSDictionaryの最初の要素を取得するにはどうすればよいですか?

NSDictionariesの配列があります。辞書の最初の要素を取り出すにはどうすればよいですか?

   NSArray *messages = [[results objectForKey:@"messages"] valueForKey:@"message"];         
    for (NSDictionary *message in messages)
    {
        STObject *mySTObject = [[STObject alloc] init];
        mySTObject.stID = [message valueForKey:@"id"];      
        stID = mySTObject.stID;
    }
36
Sheehan Alam

NSDictionaryには「最初の」要素はありません。そのメンバーには順序が保証されていません。 oneディクショナリのオブジェクトが必要なだけで、どのキーに関連付けられているかは気にしない場合は、次のようにします。

id val = nil;
NSArray *values = [yourDict allValues];

if ([values count] != 0)
    val = [values objectAtIndex:0];
60
Wevah

NSDictionariesは順不同です。つまり、最初または最後の要素はありません。実際、キーの順序は、特定のディクショナリの存続期間であっても、同じになることは保証されていません。

オブジェクトが必要な場合は、次のいずれかのキーを取得できます。

id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty
id object = [message objectForKey:key];
25
Martin Cote

NSArrayには、コードを簡素化し、読みやすくするfirstObjectという名前のセレクターがあります。

id val = [[yourDict allValues] firstObject];

yourDictが空の場合valnilになるため、辞書/配列サイズを確認する必要はありません。

5
ASLLOP

最も単純な:

[[dict objectEnumerator] nextObject];
3
Ivan

誰かがこのタイプの状況の答えをまだ探しているなら、これを参照できます:

// dictはNSDictionaryです

// [dict allKeys]は、dict内のすべてのキーを提示します

// [dict allKeys] objectAtIndex:0]は、[dict allKeys]が配列を返すため、インデックス0のすべてのキーオブジェクトから与えます。

[[dict allKeys]objectAtIndex:0];
1
1218GG

Apple によると、allKeysまたはallValuesを呼び出すと、新しい配列を作成するコストがかかります。

辞書の値を含む新しい配列、または辞書にエントリがない場合は空の配列(読み取り専用)

そのため、このようなコストが発生しない代替オプションは次のようになります。

NSString* key = nil;
for(key in yourDict)
{ // this loop will not execute if the dictionary is empty
   break; // exit loop as soon as we enter it (key will be set to some key)
}
id object = yourDict[key]; // get object associated with key. nil if key doesn't exist.

注:辞書が空の場合、キーはnilのままになり、返されるオブジェクトもnilになります。したがって、辞書が実際に空の場合の特別な処理は必要ありません。

1
LZM

NSDictionary named messageがある場合、それは非常に簡単です:

message[[[message allKeys] objectAtIndex:0]];

ただし、辞書に少なくとも1つの要素があることを確認(またはよりよく確認)する必要があります。確認方法は次のとおりです。

if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]);

しかし、NSDictionaryには順序が保証されていないため、辞書に要素が1つしかない場合にのみこのコードを使用する必要があります。

[更新]辞書の任意の要素を取得する必要がある場合は、これを使用することをお勧めします

0
n0_quarter