2013-03-04 2 views
1

Я делаю некоторый рисунок и есть класс с именем Draw2DHelper, определяющий enum констант для типов рисунков, которые я делаю, и свойство drawingType, которая использует типы:Сравнить с перечислением NSNumber

enum { 
    LINE_DRAWING, 
    BEZIER_PATH_DRAWING, 
    FRACTAL_DRAWING, 
    POINT_DRAWING 
}; 
typedef NSNumber * drawingTypes; 


@property drawingTypes drawingType; 

в предыдущей сцене я определяю UIPickerView, чтобы отражать мои типы чертежей, и заполняя массив, привязанный к нему с помощью этого кода (именно поэтому я использую NSNumber): Теперь я проследил проблему с чем-то сборщик и способ, которым он возвращает данные. У меня есть следующий код в моем родительском ViewController:

NSNumber *myNum1 = [NSNumber numberWithInt:BEZIER_PATH_DRAWING]; 
NSNumber *myNum2 = [NSNumber numberWithInt:LINE_DRAWING]; 
NSNumber *myNum3 = [NSNumber numberWithInt:POINT_DRAWING]; 
NSNumber *myNum4 = [NSNumber numberWithInt:FRACTAL_DRAWING]; 


_nameArray = [[NSArray alloc] initWithObjects: @"Bezier Path", @"Line Drawing", @"Point Drawing", @"Fractal Drawing", nil]; 

_typeArray = [[NSArray alloc] initWithObjects: myNum1, myNum2, myNum3, myNum4,nil]; 

так позже, в методе pickerView didSelectRow у меня есть это:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component 
{ 
    if (component == 0) 
    { 
     _drawingType = [_typeArray objectAtIndex: row]; 
     NSString *drawingTypeName = [ _nameArray objectAtIndex:row ] ; 
    } 
} 

что-то в стиле фанк происходит, когда _drawingType получает назначение; Я не уверен, что у меня есть правильные указатели ... Я использую строки, чтобы заполнить визуализацию сборщика. Должны ли я просто использовать их, чтобы упростить сравнение? Что я делаю не так? Я думаю, что я не мог привязать массив правильно к сборщику, поэтому метод didSelectRow не возвращает правильные данные. Мысли? Предложения?

+0

Типы объектов обычно не ... typedef'd. Возможно, вы хотели сделать typedef NSUInteger? – CodaFi

ответ

2

Ваш тип чертежа должен быть значением int. Не объект (NSNumber).

Код должен быть указан следующим образом.

typedef enum { 
    LINE_DRAWING, 
    BEZIER_PATH_DRAWING, 
    FRACTAL_DRAWING, 
    POINT_DRAWING 
} DrawingType; 


@property(nonatomic) DrawingType drawingType; 


- (void) createDrawing: (DrawingType) type : (UIBezierPath*) path :(int) maxPoints 
{ 
    switch (type)  
    { 
    case POINT_DRAWING: 
    // do something 
     break; 
    case BEZIER_PATH_DRAWING: 
    // do something 
     break; 
    default: 
     [self drawRandomSetOfSquaredBezierPaths: (UIBezierPath*) path :(int) maxPoints]; 
     break; 
    } 

} 
4

не видят никаких причин, почему она должна быть объектами NSNumber, просто использовать целые числа

enum { 
    LINE_DRAWING, 
    BEZIER_PATH_DRAWING, 
    FRACTAL_DRAWING, 
    POINT_DRAWING 
}; 
typedef NSInteger drawingTypes; 



switch (self.drawingType) //is this inside -create…? that uses type instead 
{ 
    case POINT_DRAWING: 
    // do something 
     break; 
    case BEZIER_PATH_DRAWING: 
    // do something 
     break; 
    default: 
     [self drawRandomSetOfSquaredBezierPaths: (UIBezierPath*) path :(int) maxPoints]; 
     break; 
} 

typedefed Перечисление представляет собой метод C, объекты живут в слое Objective-C. Они не подходят очень хорошо.

также смотрите на - (void) createDrawing: (drawingTypes) type : (UIBezierPath*) path :(int) maxPoints Я должен поверить, что вы хотели передать такую ​​маску, как (LINE_DRAWING| BEZIER_PATH_DRAWING) для параметра type. вы можете сделать это только с целыми числами C.

4

Я думаю, @ ответ vikingosegundo является путь, но только, чтобы ответить на исходный вопрос:

Если вы определяете перечисление следующим образом:

enum { 
    LINE_DRAWING, 
    BEZIER_PATH_DRAWING, 
    FRACTAL_DRAWING, 
    POINT_DRAWING 
}; 
typedef NSNumber * drawingTypes; 

вы можете сравнить NSNumber объектов с использованием перечисления Objective-C literals

NSNumber *number = (wherever your number comes from) 
if ([number isEqualToNumber:@(LINE_DRAWING)]) { 
} 

, который является таким же, как [number isEqualToNumber:[NSNumber numberWithInteger:LINE_DRAWIN]])

+0

благодарим вас за весь комментарий - выясняется, что все, что мне нужно было сделать, - это преобразовать свой enum в обычный тип int - все получилось после этого. – marina

+0

@marina, если один из ответов решил вашу проблему, пожалуйста, примите ответ. Дополнительную информацию см. В разделе [О странице] (http://stackoverflow.com/about) и [FAQ] (http://stackoverflow.com/faq). – Sebastian

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