Заполните mutableArray объектами из словарей в словаре - PullRequest
0 голосов
/ 23 января 2011

У меня проблемы с заполнением массива объектов (имен сотрудников) из группы NSDictionaries (каждый из которых представляет отдельного сотрудника), которые находятся внутри другого словаря NSDictionary * (персонала). Ключ для каждого дополнительного словаря - идентификатор сотрудника.

Я вполне могу прийти к этому с совершенно неправильной стороны, я очень новичок, но из того, что я прочитал, должно быть что-то вроде этого, мне удалось добраться до pName (имя сотрудника) каждый суб словарь, все будет мимолетно. Я просто не могу добавить pNames в имена MutableArray *.

любая помощь или руководство будет принята с благодарностью ...

  int i, count;
  id key, value;

  keys = [dictionary allKeys];
  count = [keys count];
  for (i = 0; i < count; i++)
  {
   key = [keys objectAtIndex: i];
   value = [dictionary objectForKey: key];
   NSLog (@"value:%@", value); 

   NSString *pName = [value objectForKey:@"personName"];
   NSLog (@"pName:%@", pName);// the debugger shows the correct pName with each loop

   [names addObject:pName];// this is wrong and i don't know why
  }
   NSLog (@"names:%@", names);// in the debugger names (null)

Ответы [ 2 ]

3 голосов
/ 23 января 2011

Вы также можете сделать это, используя операторы сбора , в частности оператор @unionOfObjects:

NSMutableArray *names = [[[personnel allValues] 
                            valueForKeyPath:@"@unionOfObjects.personName"] 
                            mutableCopy];

Обратите внимание, что names будет принадлежатьметода (его счетчик хранения равен 1), но промежуточные массивы ([personnel allValues] и созданный valueForKeyPath:) автоматически высвобождаются и не принадлежат методу.

По какой-то причине (возможно, потому что начинаются имена ключейс "@" являются специальными в valueForKey:, и, таким образом, valueForKeyPath: не будет эквивалентно последовательности вызовов valueForKey:), NSDictionary не имеет valueForKeyPath: методапоэтому сначала нужно преобразовать его в массив, используя allValues.В качестве альтернативы, вы могли бы реализовать valueForKeyPath: в категории, возможно, начиная с GnuStep's или кокотрона (который на самом деле не поддерживает @unionOfObjects, но допускает простое расширение путем определения _kvo_operator_unionOfObjects: метод).

1 голос
/ 23 января 2011

Похоже, вы не создаете объект массива для ввода своих имен. Должен быть код, подобный этому:

names = [NSMutableArray array];

... до начала цикла. Это создает пустой изменяемый массив.

...