Итерации по NSTableview или NSArrayController для получения данных

У меня есть NSTableview, привязанный к NSArrayController. Table / Arraycontroller содержит сущности Core Data "Person". Люди добавляются в NSTableview пользователем графического интерфейса.

Скажем, физическое лицо выглядит как

NSString* Name;
int Age;
NSString* HairColor;

Теперь я хочу перебрать то, что хранится в контроллере массива, чтобы выполнить в нем некоторую операцию. Фактическая операция, которую я хочу выполнить, не важна. Я действительно не хочу увязать в том, что я пытаюсь сделать с информацией. Он просто перебирает все, что хранится в NSArraycontroller, что меня сбивает. Я родом из C ++ и C # и новичок в Cocoa. Допустим, я хочу создать NSMutableArray, который будет содержать каждого человека из nsarraycontroller через 1 год в будущем.

Так что я бы хотел сделать что-нибудь вроде

NSMutableArray* mutArray = [[NSMutableArray alloc] init];

foreach(PersonEntity p in myNsArrayController)  // foreach doesn't exist in obj-c
{

  Person* new_person = [[Person alloc] init];
  [new_person setName:p.name];
  [new_person setHairColor:p.HairColor];
  [new_person setAge:(p.age + 1)];
  [mutArray addObject:new_person];

}

Я считаю, что единственное, что удерживает меня от выполнения чего-то вроде приведенного выше кода, - это то, что foreach не существует в Obj-c. Я просто не понимаю, как перебирать nsarraycontroller.

Примечание: это для OSX, поэтому у меня включена сборка мусора.


person JonF    schedule 08.02.2012    source источник


Ответы (2)



Вы также можете перечислить с помощью блоков. Например:

[myNsArrayController enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop)
 {
       PersonEntity *p = object;
       // Rest of your code
 }];

У обоих подходов есть свои плюсы и минусы. Они подробно рассматриваются в ответе на этот вопрос:

Objective-C enumerateUsingBlock против быстрого перечисления?

Вы можете найти отличное руководство по блокам в видеороликах Apple на WWDC 2010. При этом они говорят, что в Apple используют блоки «все время».

person Max MacLeod    schedule 08.02.2012