2015-11-11 2 views
0

У меня есть NSDictionary, созданный классом AFNetworking, но теперь я хочу преобразовать этот NSDictionary в массив объектов класса, который я создал. Я попытался с помощью для в петлю следующим образом:NSDictionary не зацикливается правильно

for (NSDictionary *item in results) 
     [_masterList addObject:[[MyObject alloc]initWithType:[item objectForKey:@"type"]; 

results кстати мой NSDictionary. Синтаксических ошибок нет, но когда я запускаю свою программу, ничего не возникает. Я попробовал NSLog -вход в режиме ожидания, но ничего не получил, а это значит, что цикл даже не запускается один раз. Я довольно уверен, что NSDictionary полон, потому что я NSLog эд результат в процессе AFNetworking, и он был полон:

( { address = "Sample Address"; } )

Кто-нибудь есть какие-либо идеи, которые я мог бы использовать? Пожалуйста, высказать в комментариях, если я должен добавить еще один код. Благодаря!

+0

Можете ли вы разместить логин 'results'? – anhtu

+0

Я уже разместил журнал. –

+0

Что такое журнал '_masterList' после цикла' for'? – Tommy

ответ

0

Есть ни одна клавиша type, не изменить его address

for (NSDictionary *item in results) 
    [_masterList addObject:[[MyObject alloc]initWithType:[item objectForKey:@"address"]; 
+0

Ум ... в чем разница между этим и моим кодом? –

+0

@JackThomas, что вы изменили? – anhtu

+0

@JackThomas Вы попробовали мой ответ? И что случилось? – anhtu

0

не так много ответа, но слишком большой для комментария: вы сделали ошибку другой, чем в коде, представленном. Попробуйте:

NSArray *results = @[ 
    @{ 
     @"address": @"Sample Address" 
    } 
]; 

NSLog(@"%@", results); 

for (NSDictionary *item in results) 
    NSLog(@"%@ (%@)", item, [item objectForKey:@"address"]); 

Выход:

2015-11-10 23:20:22.713 Untitled[1564:1904151] (
     { 
     address = "Sample Address"; 
    } 
) 
2015-11-10 23:20:22.715 Untitled[1564:1904151] { 
    address = "Sample Address"; 
} (Sample Address) 

Так, безусловно, тот же словарь, то же итерации кода, с правильными результатами.


Добавление, которые могут или не могут быть полезны: одна из вещей, которые поставляет Apple, чтобы воспользоваться отражательной выполнения Objective-C является ключ-значение кодирования, который, предполагая, что ваши свойства подчиняются определенным правилам, позволяет им быть написанных по имени. Если у вас есть словарь, который вы хотели, чтобы добраться до объекта, и выполнил соответствующую проверку, то вы могли бы:

NSDictionary *inputDictionary = ... whatever ... 
SomeObject *target = [[SomeObject alloc] init]; 

for (NSString *key in inputDictionary) 
    [target setValue:inputDictionary[key] forKey:key]; 

В отличие от норм Objective-C, но последовательно с большинством современных языков, что будет вызывать исключение если ключ не существует как свойство на target. Поэтому в производственном коде вы, вероятно, хотите, по крайней мере, блок try/catch, если словарь издалека издалека.

+0

'results' не NSArray; он объявлен как NSDictionary –

+0

@JackThomas, тогда ваша проблема где-то в ваших неправильных знаниях о результатах сети. То, что вы напечатали в своем вопросе, - это массив. Попробуйте 'NSLog (@"% @ ", [results class])' и убедитесь сами. – Tommy

+0

Ах ... Понятно. Как тогда я пропустил бы NSDictionary через быстрый цикл перечисления? –

0

results - NSDictionary или NSArray словарей? Если это NSDictionary, тогда вы должны процитировать вот так:

// loop through each key in dictionary 
// let say your key type is NSString 
for (NSString* key in results) { 

    // access your object for key here 
    NSLog(@"%@", results[key]); 
} 
+0

Ahh ... ОК. Что результаты [ключ] возвращаются кстати? –

+0

Просто короткая версия '[result objectForKey: key]' – kientux

Смежные вопросы