如何将Integer与Objective-C枚举进行比较

时间:2014-11-10 15:25:18

标签: objective-c macos cocoa enums

- (void)updateCheckBoxes {
    NSArray *availableFuncUnits = _scanner.availableFunctionalUnitTypes;
    for(int i = 0; i < [availableFuncUnits count]; i++) {

    }
}

如果我在for循环中放置一个断点,那么NSArray *&#39; availableFuncUnits&#39;是(__NSCFNumber *)(int)0(__NSCFNumber *)(long)3

该数组应包含以下元素:

enum
{
    ICScannerFunctionalUnitTypeFlatbed              = 0,
    ICScannerFunctionalUnitTypePositiveTransparency = 1,
    ICScannerFunctionalUnitTypeNegativeTransparency = 2,
    ICScannerFunctionalUnitTypeDocumentFeeder       = 3
};
typedef NSUInteger ICScannerFunctionalUnitType; 

我不能做到以下几点吗?

if([availableFuncUnits objectAtIndex:i] == ICScannerFunctionalUnitType.ICScannerFunctionalUnitTypeDocumentFeeder) {}

但是它总是给我一个错误,说“&#39;预期的标识符或&#39;(&#39;。

如何正确执行此比较?非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我看到两个问题:
1)数组availableFuncUnits包含NSNumber个对象。你不能直接将它们与原始类型(NSUInteger)进行比较。

所以你的if应该是这样的:

ICScannerFunctionalUnitType type = [availableFuncUnits[i] integerValue]
if(type == ICScannerFunctionalUnitTypeDocumentFeeder){}

在您的代码段中,您正在比较指针,而不是对象。

2)您看到的错误是因为使用枚举的正确方法是:

i = ICScannerFunctionalUnitTypeDocumentFeeder

答案 1 :(得分:1)

您无法在NSArray中存储整数,因为数组只能包含对象。要将整数转换为数组,必须使用NSNumber包装:

NSInteger a = 100;
NSInteger b = 200;
NSInteger c = 300;

// Creating NSNumber objects the long way 
NSArray *arrayOne = [NSArray alloc] initWithObjects:[NSNumber numberWithInteger:a],
                                                    [NSNumber numberWithInteger:b],
                                                    [NSNumber numberWithInteger:c], nil];
// Creating NSNumber objects the short way
NSArray *arrayTwo = [[NSArray alloc] initWithObjects:@100, @200, @300, nil];

这与您的问题相关,因为当您从数组中提取NSNumber个对象时,如果您想将它们与实际整数进行比较,则必须将它们转换回整数(展开它们)。

NSLog(@"%d", [arrayOne firstObject] == 100); // COMPILER WARNING!!!
NSLog(@"%d", [[arrayOne firstObject] integerValue] == 100); // True
NSLog(@"%d", [[arrayTwo lastObject] integerValue] == 200);  // False

您的示例中似乎缺少此阶段。

最后,为了将整数值与enum中的整数值进行比较,无需引用enum名称,只需使用构成枚举的各个值:

[[arrayTwo lastObject] integerValue] == ICScannerFunctionalUnitTypeFlatbed