如何检查具有多个值的枚举类型参数是否具有特定的枚举类型

时间:2018-04-03 11:16:01

标签: ios objective-c enums compare

我有一个返回枚举的方法。

-(EnumType)supportedEnum {
return EnumTypeA | EnumTypeB | EnumTypeC;
}

在另一种方法中,我正在比较支持的枚举是否包含特定的枚举类型,如下所示:

if ([Instance supportedEnum] == EnumTypeA) {
NSLog("Class contains EnumTypeA");
}

但它不起作用,因为这种情况在某种程度上是错误的。 我做错了什么?

3 个答案:

答案 0 :(得分:1)

您似乎尝试定义并使用enum作为选项集。要做到这一点,你必须首先定义你的enum文字,使其具有2的幂,这意味着,当底层硬件使用二进制时,每个值在其值中只有一位设置。您还可以将enum的基础类型设置为:uint8_tuint16_tuint32_tuint64_t;允许您的enum分别包含最多8,16,32或64个文字。例如:

typedef enum : uint8_t
{
   EnumTypeA = 0x1,
   EnumTypeB = 0x2,
   EnumTypeC = 0x4,
   EnumTypeD = 0x8,
   EnumTypeE = 0x10
} EnumType;

注意:使用了十六进制常量,因为它们更清楚地显示每个值中只设置了一个位,但如果您愿意,可以使用十进制(或八进制)。

注意:Objective-C还提供了一个宏NS_OPTIONS,可用于帮助定义选项集enum,使用它是一个选择问题。如果您打算使用Swift进行交互操作,可能会建议使用它。请查看Apple的文档以供其使用。

组合文字以使用按位 - 或|生成设定值,就像在方法中一样:

- (EnumType)supportedEnum
{
   return EnumTypeA | EnumTypeB | EnumTypeC;
}

返回值EnumType,设置正好为3位。

要测试存在的特定值,请使用按位 - 和&,例如:

if ([instance supportedEnum] & EnumTypeA)
{
   NSLog("Class contains EnumTypeA");
}

这作为if测试,其谓词表达式不等于零(这在(Objective-)C特性中,if不采用布尔值谓词,而是采用整数值)。

如果您希望测试是否存在一组enum个文字中的任何一个或多个,则按位和和或组合。例如。要测试你会写的EnumTypeA和/或EnumTypeC

if ([instance supportedEnum] & (EnumTypeA | EnumTypeC) ) ...

要测试存在的所有文字集,必须添加相等比较。 E.g:

if ( ([instance supportedEnum] & (EnumTypeA | EnumTypeC)) == (EnumTypeA | EnumTypeC) ) ...

同时测试EnumTypeAEnumTypeC

使用按位和,或,xor和inverse运算符,它们的复合赋值版本和(in)相等运算符,您可以在enum值中设置或清除单个文字;联合等两个或多个值;并测试任何文字组合存在/设定和/或缺席/清除。

HTH

答案 1 :(得分:0)

您需要检查可访问性枚举代码 以下是enum的示例,仅供您参考。不要使用只能用于枚举样本的可达性代码。

首先你需要用enum" EnumType"创建变量。 然后你需要用" EnumTypeA"," EnumTypeB"," EnumTypeC"

检查你的变量
- (void)updateInterfaceWithReachability:(Reachability *)reachability {
    NetworkStatus netStatus = [reachability currentReachabilityStatus];
    BOOL connectionRequired = [reachability connectionRequired];

    switch (netStatus) {
        case NotReachable: {
            connectionRequired = NO;
            self.isReachable = false;
        }
            break;

        case ReachableViaWWAN: {
            self.isReachable = true;
        }
            break;

        case ReachableViaWiFi: {
            self.isReachable = true;
        }
            break;

        default: {
            self.isReachable = false;
        }
            break;
    }
    NSLog(@"\nisReachable = %d\n",isReachable);
}

答案 2 :(得分:0)

您的条件总是失败的原因是因为您在supportedEnum方法中所做的是二元OR(|)运算符。

所以supportedEnum方法返回3(0 | 1 | 2 = 3和1 | 2 | 3 = 3) 你正在检查与EnumTypeA,这就是为什么你的condtion alwasy失败。

你可以使用switch case或if-else作为@vivek方法。但要澄清如何正确实施您实施的内容。你可以将你的枚举转换为NSNumber并执行包含检查。

注意:在大量枚举的情况下执行if-else或切换会使代码位变长。

例如:

typedef enum : NSUInteger {
    EnumTypeA,
    EnumTypeB,
    EnumTypeC,
    EnumTypeD
} EnumType;


//Here I am just converting the enum to Array of NSNumber.
-(NSArray*)supportedEnums {
   return @[@(EnumTypeA), @(EnumTypeB), @(EnumTypeC)];
 }


//Check by performing a contains check in the array.
if ([[self supportedEnums] containsObject:@(EnumTypeA)]) {
    NSLog(@"Class contains EnumTypeA");
}else {
    NSLog(@"Error in condition");
}