2010-08-19 3 views
1

У меня есть NSArray, содержащий несколько NSDictionaries.Вложенная задача NSArray/NSDictionary

У меня есть NSString, содержащий строку ID.

Что я пытаюсь сделать, это перебирать NSDictionaries, пока не найду объект, соответствующий NSString. Затем я хочу вернуть весь NSDictionary.

Я довольно новичок в разработке iPhone, поэтому я, вероятно, пропустил что-то очевидное ... Спасибо заранее. :)

Редактировать, вот .plist файл, который будет сохранен из:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>date</key> 
     <string>2011/05/20</string> 
     <key>id</key> 
     <string>1282007740</string> 
     <key>name</key> 
     <string>Test item name</string> 
     <key>niceDate</key> 
     <string>May 20, 2011</string> 
    </dict> 
    <dict> 
     <key>date</key> 
     <string>2010/08/15</string> 
     <key>id</key> 
     <string>1282075925</string> 
     <key>name</key> 
     <string>Test. Nothing to see here.</string> 
     <key>niceDate</key> 
     <string>Aug 15, 2010</string> 
    </dict> 
</array> 
</plist> 

Скажем, мой NSString является "1282075925". Я хочу получить словарь с ключевым словом id.

+0

Дополнительная информация. Может, какой-то код? Какие словарные ключи? – jtbandes

+0

Извините, я обновил его с представлением массива (в форме plist). –

+0

Можете ли вы привести пример того, что ищет NSString? В частности, вы ищете «ключ» или «значение». т. е. вы ищете «имя» или «Имя элемента теста» – Akusete

ответ

3

Этот код должен делать то, что вы хотите, - в конце концов, dict будет либо точка на NSDictionary вы поиск, или будет nil если не было подходящего словаря.

// (These are assumed to exist) 
NSArray *dictionaries; 
NSString *idToFind; 



NSDictionary *dict = nil; 
for (NSDictionary *aDict in dictionaries) { 
    if ([[aDict objectForKey:@"id"] isEqualToString:idToFind]) { 
     dict = aDict; 
     break; 
    } 
} 
+0

+1 для стиля. Но будет ли он вызывать ошибку «selector not supported», если значение для поля «id» является массивом или другим типом, кроме NSString? – Akusete

+1

Это хороший момент. Если plist создан и поддерживается вами, обсуждается, стоит ли пытаться защищать кодирование для подобных проблем. Когда дело доходит до статических данных plist, я обычно не помещаю туда такие защитные чеки, так как предпочитаю краткий (или более точный, читаемый) код. Если я работаю с другими кодерами, или plist может быть отредактирован кем-то другим, я обычно буду. Это призыв к суждению. –

+0

Я не беспокоюсь о том, что это тип, отличный от NSString. Я пробовал ваше решение, так как это особенно просто и элегантно. К сожалению, по какой-то причине он не будет соответствовать строке словаря. Я вложил некоторые NSLogs для его отладки, но я не могу понять, где это происходит. Значения, которые я подключаю, должны совпадать, и процедура, которая создала plist, вставляет NSString, поэтому это не проблема типа ... –

2

Если вы ищете @ «12345», с ключом @ «ID»

for (NSDictionary* dictionary in array1) { 
    id value = [dictionary valueForKey:@"id"]; 
    if ([value isKindOfClass:[NSString class]]) { 
     NSString* string = (NSString*) value; 
     if ([string isEqualToString:@"12345"]) { 
      return dictionary; 
     } 
    } 
} 
return nil; 
Смежные вопросы