Как я могу получить первый элемент в NSDictionary? - PullRequest
36 голосов
/ 23 апреля 2010

У меня есть массив 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;
    }

Ответы [ 8 ]

60 голосов
/ 23 апреля 2010

В NSDictionary нет «первого» элемента; его участники не имеют гарантированного заказа. Если вы просто хотите один объект из словаря, но вам не важно, с каким ключом он связан, вы можете сделать:

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

if ([values count] != 0)
    val = [values objectAtIndex:0];
25 голосов
/ 23 апреля 2010

NSDictionaries неупорядочены, это означает, что нет ни первого, ни последнего элемента. На самом деле порядок ключей никогда не будет одинаковым даже при жизни определенного словаря.

Если вам нужен какой-либо объект, вы можете получить один из ключей:

id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty
id object = [message objectForKey:key];
5 голосов
/ 26 мая 2016

NSArray имеет селектор с именем firstObject, который упрощает код и делает его более читабельным:

id val = [[yourDict allValues] firstObject];

Если yourDict пусто val будет nil, поэтому нет необходимости проверять размер словаря / массива.

3 голосов
/ 03 февраля 2017

Простейшее:

[[dict objectEnumerator] nextObject];
1 голос
/ 18 ноября 2015

Если кто-то все еще ищет ответ для ситуации такого типа, то можете сослаться на это:

// dict is NSDictionary

// [dict allKeys] выдаст все ключи в dict присутствует

// [[dict allKeys] objectAtIndex: 0] будет отдавать из всех объектов ключа индекс 0, поскольку [dict allKeys] возвращает массив.

[[dict allKeys]objectAtIndex:0];
1 голос
/ 03 марта 2015

Согласно 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.

Примечание. Если словарь пуст, ключ останется нулевым, а возвращаемый объект также будет нулевым, поэтому нам не требуется специальная обработка в случае, когда словарь фактически пуст.

0 голосов
/ 21 апреля 2014

Попробуйте это:

NSDictionary *firstValue = [responseObject objectAtIndex:0];
0 голосов
/ 23 октября 2013

Если у вас есть NSDictionary с именем message , Все довольно просто:

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

Но вы должны быть уверены (или лучше проверить), что в вашем словаре есть хотя бы один элемент. Вот как это можно проверить:

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

Но у NSDictionary нет гарантированного порядка, поэтому вам, вероятно, следует использовать этот код, только если в вашем словаре есть только один элемент.

[ОБНОВЛЕНО] Это также хорошая идея использовать это, если вам нужно получить ЛЮБОЙ элемент словаря

...