2011-01-31 6 views
1

У меня есть NSMutableArray, который я загружаю разными объектами (классами).Цитирование через 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 являются общими для всех объектов, хранящихся в массиве.

Спасибо всем помочь

+0

Я думаю, что вы можете получить тип класса, если используете [класс объекта] и сравниваете его с ожидаемым классом. Но я не уверен, правильно ли я получил вашу проблему ... –

ответ

5

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

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. 
    } 
} 
+0

рок сверху .... это сработано безупречный. спасибо – pithhelmet

3

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

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; 
} 

В зависимости от контекста.

+1

'obj.x_coord' * идентичен * для' [obj x_coord] '. Они скомпилируются в одно и то же. –

+0

@Dave DeLong: они компилируются в одно и то же * если и только если * переменная имеет одинаковый статический тип в обоих примерах, и вы используете имена аксессуаров по умолчанию. Здесь переменная не имеет статического типа, поэтому компилятор откажется от синтаксиса точки. – Chuck

+0

Они могут скомпилировать то же самое (не знаю), но они не идентичны. Попробуйте, например, с сообщением 'count':' [foo count] 'будет работать для' foo' типа 'id', но' foo.count' не будет. – zoul

0

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

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 к.

Смежные вопросы