NSMutableArray - заставляет массив содержать только определенный тип объекта - PullRequest
66 голосов
/ 04 марта 2011

Есть ли способ заставить NSMutableArray содержать только один конкретный тип объекта?

У меня есть следующие определения классов:

@interface Wheel:NSObject  
{    
  int size;  
  float diameter;  
}  
@end  


@interface Car:NSObject  
{  
   NSString *model;  
   NSString *make;  
   NSMutableArray *wheels;  
}  
@end

Как заставить массив колеса удерживать колесо объекты только с кодом? (и абсолютно не другие объекты)

Ответы [ 12 ]

0 голосов
/ 20 сентября 2012

Вы можете использовать исключение nsexception, если у вас нет определенного объекта.

for (int i = 0; i<items.count;i++) {
 if([[items objectAtIndex:i] isKindOfClass:[Wheel class]])
 {
  // do something..!
 }else{
  [NSException raise:@"Invalid value" format:@"Format of %@ is invalid", items];
  // do whatever to handle or raise your exception.
 }
}
0 голосов
/ 04 марта 2011

Это невозможно; NSArray (изменяемый или нет) будет содержать любой тип объекта. Что вы можете сделать, это создать свои собственные подклассы, как уже предложено Джимом. В качестве альтернативы, если вы хотите отфильтровать массив для удаления объектов не того типа, который вам нужен, вы можете сделать следующее:

- (void)removeObjectsFromArray:(NSMutableArray *)array otherThanOfType:(Class)type
{
    int c = 0;
    while(c < [array length])
    {
        NSObject *object = [array objectAtIndex:c];
        if([object isKindOfClass:type])
          c++;
        else
          [array removeObjectAtIndex:c];
    }
}

...
[self removeObjectsFromArray:array otherThanOfType:[Car class]];

Или выносить другие суждения на основе результата isKindOfClass :, например, разделить массив, содержащий смесь автомобилей и колес, на два массива, каждый из которых содержит только один тип объекта.

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