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;
}
NSDictionaryには「最初の」要素はありません。そのメンバーには順序が保証されていません。 oneディクショナリのオブジェクトが必要なだけで、どのキーに関連付けられているかは気にしない場合は、次のようにします。
id val = nil;
NSArray *values = [yourDict allValues];
if ([values count] != 0)
val = [values objectAtIndex:0];
NSDictionariesは順不同です。つまり、最初または最後の要素はありません。実際、キーの順序は、特定のディクショナリの存続期間であっても、同じになることは保証されていません。
オブジェクトが必要な場合は、次のいずれかのキーを取得できます。
id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty
id object = [message objectForKey:key];
NSArrayには、コードを簡素化し、読みやすくするfirstObject
という名前のセレクターがあります。
id val = [[yourDict allValues] firstObject];
yourDict
が空の場合val
はnil
になるため、辞書/配列サイズを確認する必要はありません。
最も単純な:
[[dict objectEnumerator] nextObject];
誰かがこのタイプの状況の答えをまだ探しているなら、これを参照できます:
// dictはNSDictionaryです
// [dict allKeys]は、dict内のすべてのキーを提示します
// [dict allKeys] objectAtIndex:0]は、[dict allKeys]が配列を返すため、インデックス0のすべてのキーオブジェクトから与えます。
[[dict allKeys]objectAtIndex:0];
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になります。したがって、辞書が実際に空の場合の特別な処理は必要ありません。
NSDictionary named messageがある場合、それは非常に簡単です:
message[[[message allKeys] objectAtIndex:0]];
ただし、辞書に少なくとも1つの要素があることを確認(またはよりよく確認)する必要があります。確認方法は次のとおりです。
if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]);
しかし、NSDictionaryには順序が保証されていないため、辞書に要素が1つしかない場合にのみこのコードを使用する必要があります。
[更新]辞書の任意の要素を取得する必要がある場合は、これを使用することをお勧めします