【问题标题】:Objective-c multiply equality with or in if statementObjective-c在if语句中乘以或等于
【发布时间】:2013-08-02 12:47:33
【问题描述】:

我不太明白这两者有什么区别:

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

【问题讨论】:

    标签: objective-c if-statement switch-statement


    【解决方案1】:

    在第二个示例中,您正在执行按位运算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!!
    

    【讨论】:

      【解决方案2】:

      | 是按位 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...
      }
      

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

      【讨论】:

      • 哦,现在我明白了,谢谢。因此,如果我想制作类似if (self.someEnum == (5 OR 2) ) 的东西,那么最短的解决方案就是我的第一个示例?
      • @TussLászló 如果您想将两者与 someEnum 进行比较,那么可以。不过添加了一个替代方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多