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



我有一个方法返回枚举。

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

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

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

,但由于这种情况是错误的,因此无法正常工作。我在做什么错?

您似乎正在尝试定义并将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 S,使用它是一个选择。如果您打算与Swift使用,建议使用它。在Apple的文档中查看使用。

您将文字结合起来,使用bitwise-or, |产生设定值,就像您在方法中所做的那样:

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

返回恰好3位的EnumType值。

要测试出现特定值,您可以使用位 - &,例如:

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

这可以用作if的谓词表达的测试不等于零(在(客观 - (c特殊性中, if不采用布尔值有价值的谓词,而是一个积分价值(。

>

>

如果您想测试是否存在一组或多种enum文字,则可以将位于位和OR组合。例如。要测试EnumTypeA和/或EnumTypeC,您将写:

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

要测试所有存在的文字,您必须添加平等比较。例如:

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

EnumTypeAEnumTypeC的测试。

使用位和XOR和逆运算符,其复合分配版本以及(在(平等运算符中,您可以在enum值中设置或清除单个文字;联合等两个或多个值;并测试存在/设置和/或不存在/清除的任何文字组合。

hth

您需要检查可及枚举代码这是枚举的样本,仅供您参考。不要使用可及性代码,它仅适用于枚举样本。

首先,您需要使用枚举" 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 = %dn",isReachable);
}

原因您的状况总是失败的原因是您在supportedEnum方法中所做的事情是二进制或(|(运算符。

所以supportedEnum方法返回3(0 | 1 | 2 = 3和1 | 2 | 3 = 3(您正在用Enumtypea检查一下,这就是为什么您的Condtion Alwasy失败的原因。

您可以使用Switch Case或If-Else作为@vivek方法进行操作。但是要澄清如何正确实施您实施的功能。您可以将枚举转换为nsnumber并进行表演。

注意:在大量枚举的情况下进行IF-ELSE或切换会使您的代码有点长。

eg:

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");
}

相关内容

  • 没有找到相关文章

最新更新