我有一个返回枚举的方法。
-(EnumType)supportedEnum {
return EnumTypeA | EnumTypeB | EnumTypeC;
}
在另一种方法中,我正在比较支持的枚举是否包含特定的枚举类型,如下所示:
if ([Instance supportedEnum] == EnumTypeA) {
NSLog("Class contains EnumTypeA");
}
但它不起作用,因为这种情况在某种程度上是错误的。 我做错了什么?
答案 0 :(得分:1)
您似乎尝试定义并使用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还提供了一个宏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) ) ...
同时测试EnumTypeA
和EnumTypeC
。
使用按位和,或,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");
}