我有一个方法返回枚举。
-(EnumType)supportedEnum {
return EnumTypeA | EnumTypeB | EnumTypeC;
}
在另一种方法中,我正在比较是否支持的枚举包含以下特定的枚举类型:
if ([Instance supportedEnum] == EnumTypeA) {
NSLog("Class contains EnumTypeA");
}
,但由于这种情况是错误的,因此无法正常工作。我在做什么错?
您似乎正在尝试定义并将enum
用作选项集。为此,您必须首先定义您的enum
文字以具有2的值,这意味着,由于基础硬件使用二进制,每个值都在其值中完全设置了一个位。您还可以将enum
的基础类型设置为:uint8_t
,uint16_t
,uint32_t
或uint64_t
;允许您的enum
分别具有8、16、32或64个文字。例如:
typedef enum : uint8_t
{
EnumTypeA = 0x1,
EnumTypeB = 0x2,
EnumTypeC = 0x4,
EnumTypeD = 0x8,
EnumTypeE = 0x10
} EnumType;
注意:使用十六进制常数,因为它们更清楚地显示每个值仅设置一个位,但是如果您喜欢 注意:Objective-C还提供了一个宏 您将文字结合起来,使用bitwise-or, 返回恰好3位的 要测试出现特定值,您可以使用位 - 这可以用作NS_OPTIONS
,可用于帮助定义选项集enum
S,使用它是一个选择。如果您打算与Swift使用,建议使用它。在Apple的文档中查看使用。|
产生设定值,就像您在方法中所做的那样:- (EnumType)supportedEnum
{
return EnumTypeA | EnumTypeB | EnumTypeC;
}
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) ) ...
EnumTypeA
和EnumTypeC
的测试。
使用位和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");
}