0

我真的不明白这两者之间有什么区别:

If (self.someEnum == someEnumValue1 || self.someEnum == someEnumValue2)
{
// Do some stuff
}

If (self.someEnum == (someEnumValue1 | someEnumValue2) )
{
// Do some stuff
}

第二个显然不起作用,但它没有给出任何警告或错误,但我不知道它的用途。

我认为它像这个开关一样工作:

switch (self.someEnum){
    case someEnumValue1:
    case someEnumValue2:
    {
    // Do some stuff
    }
    break;

    default: break;
}
4

2 回答 2

2

在第二个示例中,您正在执行按位运算OR,然后将结果与self.someEnum. 这在使用 bitFlags(即)时很有用,您可以存储具有不同组合可能性的值,如上:

enumWeekDays = kWeekDaySunday | kWeekDayMonday;

if (enumWeekDays & kWeekDayTursday == kWeekDayTursday ) ... //will not enter here
if (enumWeekDays & kWeekDayMonday == kWeekDayMonday ) ... //will enter here

只是为了澄清:

kWeekDaySunday = 1 ==> 00000001
kWeekDayMonday = 2 ==> 00000010

enumWeekDays = 00000001 OR 00000010 ==> 00000011

使用按位 AND 您可以进行比较,如下所示:

if ( 00000011 //enumWeekDays
     00000010 //kWeekDayMonday 
    --------- //and
     00000010 ==> kWeekDayMonday!!
于 2013-08-02T13:01:40.293 回答
1

|是位运算OR符,所以你的行;

if (self.someEnum == (someEnumValue1 | someEnumValue2) )

其中 someEnumValue1 = 5 和 someEnumValue2 = 2 最终会是;

if (self.someEnum == (5 | 2) )

这与

if (self.someEnum == 7 )

...其中,如果 someEnum 是 5 或 2 之一,则也不匹配。

基本上有两种方法可以做你想做的事情,要么像你一样单独进行比较,要么使用switch/case;

switch(self.someEnum) {
  case 5:
  case 2:
    ...do your stuff if 5 or 2...
    break;
  default:
    ...and here you do your stuff if they're not...
}

如果有很多比较,后者可能很有用,您当前的版本通常在少数情况下更具可读性。

于 2013-08-02T12:54:12.970 回答