将枚举与NSNumber进行比较

时间:2013-03-04 02:42:53

标签: objective-c cocoa pointers comparison nsnumber

我正在做一些绘图并且有一个名为Draw2DHelper的类,它为我正在制作的绘图类型定义了enum个常量,以及一个使用这些类型的属性drawingType

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方法没有返回正确的数据。思考?建议?

3 个答案:

答案 0 :(得分: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整数来做到这一点。

答案 1 :(得分:4)

我认为@ vikingosegundo的答案是要走的路,但只是回答原来的问题:

如果你这样定义你的枚举:

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

然后,您可以使用Objective-C literals

将NSNumber对象与枚举进行比较
NSNumber *number = (wherever your number comes from)
if ([number isEqualToNumber:@(LINE_DRAWING)]) {
}

[number isEqualToNumber:[NSNumber numberWithInteger:LINE_DRAWIN]])

相同

答案 2 :(得分: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;
    }

}