Как я могу выполнить итерацию и получить все значения в NSDictionary?

#iphone #objective-c #xcode #nsdictionary #xmlreader

#iPhone #objective-c #xcode #nsdictionary #xmlreader

Вопрос:

У меня проблема.

Я использую класс XmlReader для получения NSDictionary , и все работает нормально. Но я не могу получить значения атрибутов моего элемента ProductData.

В частности, у меня есть следующее NSDictionary :

 {
response = {
  products = {
   productsData = (
    {
    alias = "Product 1";
    id = 01;
    price = "10";
    },
    {
    alias = "Product 2";
    id = 02;
    price = "20";
    },
    {
    alias = "Product 3";
    id = 03;
    price = "30";
  });
 };
};
}
  

Я использовал этот код для создания de NSDictionary :

 NSDictionary *dictionary = [XMLReader dictionaryForXMLData:responseData error:amp;parseError];
  

и responseData содержит:

 <application>
  <products>
    <productData>
      <id>01</id>
      <price>10</price>
      <alias>Product 1</alias>
    </productData>
    <productData>
      <id>02</id>
      <price>20</price>
      <alias>Product 2</alias>
    </productData>
    <productData>
      <id>02</id>
      <price>20</price>
      <alias>Product 3</alias>
    </productData>
  </products>
</application>
  

Тогда я не знаю, как получить значения каждого ProductData, такие как id, цена и псевдоним…

Кто-нибудь знает, как это сделать??

Спасибо и, пожалуйста, простите мой плохой английский!

Комментарии:

1. Похоже, у вас есть вложенные словари. Используйте [[dic objectForKey:@»response»]objectForKey:@»products»], следующим может быть массив словарей, я не знаю, наберитесь терпения и записывайте каждый шаг в журнал.

Ответ №1:

 NSArray* keys = [theDict allKeys];

for(NSString* key in keys) {
    id obj = [theDict objectForKey:key];

    // do what needed with obj
}
  

вы могли бы попробовать что-то вроде этого :

 NSArray* keys = [theDict allKeys];

for(NSString* key in keys) {
    if ([key isEqualToString:@"product"]) {
    NSArray* arr = [theDict objectForKey:key];

    // do what needed with arr 
}
    }
  

Комментарии:

1. Спасибо за ваш ответ :). Просто обратите внимание, что [key isEqualToString@"product"] должно быть [key isEqualToString:@"product"] с :

Ответ №2:

В NSDictionary -allValues есть метод, который возвращает новый массив, содержащий значения словаря. Возможно, это поможет.

Ответ №3:

Начиная с

 NSDictionary *dictionary = [XMLReader dictionaryForXMLData:responseData error:amp;parseError];
  

вы можете сделать что-то вроде этого:

 NSDictionary *application = [dictionary objectForKey:@"application"];
if ([[application objectForKey:@"products"] isKindOfClass [NSArray class]]) {
    NSArray *products = [application objectForKey:@"products"];
    for (NSDictionary *aProduct in products) {
       // do something with the contents of the aProduct dictionary
    }
else if {[[application objectForKey:@"products"] isKindOfClass [NSDictionary class]]) {
    // you will have to see what the returned results look like if there is only one product 
    // that is not in an array, but something along these lines may be necessary
    // to get to a single product dictionary that is returned
}
  

У меня был случай, подобный этому (синтаксический анализ JSON), когда массив не был возвращен для значения signle, поэтому результат должен был быть проверен как для массива (словарей продуктов в вашем случае), так и для одного NSDictionary (словаря продуктов в вашем случае).

Комментарии:

1. Спасибо, Джим … работает отлично! Я не знал, что он вернет NSDictionary, когда это будет один результат, и он вернет NSArray (в частности, массив NSDictionarys ), когда будет много результатов… Еще раз спасибо!