Цикл через NSMutableArray - PullRequest
       3

Цикл через NSMutableArray

2 голосов
/ 31 января 2011

У меня есть NSMutableArray, который я загружаю различными объектами (классами).

Теперь мне нужно пройти через массив и перейти к классам для дальнейшей манипуляции.

Я пробовал этот подход ...

for (id obj in allPointsArray)   
  {
/////   this is where i need to bring the obj into a class to work with
    NSInteger loc_x = obj.x_coord;
    NSInteger loc_y = obj.y_coord;
  }

но я не могу заставить себя вынести класс из массива и поместить его в пригодный для использования объект.

x_coord и y_coord являются общими для всех объектов, хранящихся в массиве.

Спасибо всем за помощь

Ответы [ 3 ]

5 голосов
/ 31 января 2011

Вы пытаетесь делать разные вещи, если объекты в массиве принадлежат к разным классам? Вы могли бы сделать что-то вроде этого:

for (id obj in myArray) {
    // Generic things that you do to objects of *any* class go here.

    if ([obj isKindOfClass:[NSString class]]) {
        // NSString-specific code.
    } else if ([obj isKindOfClass:[NSNumber class]]) {
        // NSNumber-specific code.
    }
}
3 голосов
/ 31 января 2011

Код должен работать, если вы используете синтаксис сообщения вместо точечного:

for (id obj in allPointsArray) {
    NSInteger loc_x = [obj x_coord];
    NSInteger loc_y = [obj y_coord];
}

Или вы можете написать общий протокол для всех ваших точек:

@protocol Pointed
@property(readonly) NSInteger x_coord;
@property(readonly) NSInteger y_coord;
@end

@interface FooPoint <Pointed>
@interface BarPoint <Pointed>

СейчасВы можете сузить тип в итерации и использовать точечный синтаксис:

for (id<Pointed> obj in allPointsArray) {
    NSInteger loc_x = obj.x_coord;
    NSInteger loc_y = obj.y_coord;
}

Зависит от контекста.

0 голосов
/ 31 января 2011

Вы можете использовать -isKindOfClass: метод экземпляра NSObject для проверки ваших объектов на предмет принадлежности к классу.Таким образом:

for (id obj in allPointsArray) {
    if ([obj isKindOfClass:[OneThing class]]) {
        OneThing* thisThing = (OneThing *)obj;
        ....
    }
    else if ([obj isKindOfClass:[OtherThing class]]) {
        OtherThing *thisThing = (OtherThing *)obj;
        ....
    }
}

Если вы сделаете это таким образом, он не только скомпилирует, но Xcode предложит полезные дополнения кода, основанные на классе, к которому вы приводите thisThing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...