【问题标题】:Range? Logical Or? objective C范围?逻辑或?目标C
【发布时间】:2012-05-06 02:40:24
【问题描述】:

这里是初学者的问题:

如果我正在编写一个 If 语句,我想与值范围(特别是标签)相关联,除了使用逻辑 OR 之外,还有更简单的方法吗?

if (tableView.tag == 1 || tableView.tag==2 || tableView.tag==3) { do something}

这看起来效率不高..

【问题讨论】:

  • 不幸的是,IN 运算符类似于 Pascal。很少有语言具有此功能。

标签: objective-c logical-operators


【解决方案1】:
if (tableView.tag >= minRange && tableView.tag <= maxRange)
{
}

【讨论】:

    【解决方案2】:

    取决于您对“更容易”的定义...对于少量比较,效率并不是真正需要考虑的;您可以测试单个值,或者如果这些值是连续的,请执行 &gt;=&lt;= 测试。如果您愿意,您可以随时使用宏或内联函数来整理内容,例如:

    NS_INLINE BOOL inRange(lower, value, upper) { return (lower <= value) && (value <= upper); }
    

    对于大量测试,或者只是为了美观,其他方法包括使用位掩码和数组。

    如果您要测试少量(最多 32 或 64 个)连续值,那么您可以为要测试的集合定义位掩码并执行按位和运算。例如:

    typedef enum { Sunday = 0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } Day;
    
    int WeekendSet = (1 << Sunday | 1 << Saturday);
    
    if ( (1 << day) & WeekendSet ) // day is a weekend
    

    对于较大但仍不太大的集合,您可以使用数组。这就是标准库isletter()isdigit() 等函数有时是如何定义的。由于一个单字节字符最多有 255 个声明具有 256 个元素的静态布尔数组,效果很好。例如

    static uint8 isADigit[] = { 0, 0, ..., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ... }; // 256 values, only 10 1's for position's '0' through '9'
    
    if ( isADigit[myChar] ) // myChar is a digit
    

    【讨论】:

      【解决方案3】:

      如果您要测试的值是整数类型,您可以将switch 与fall-through 一起使用:

      switch(tableView.tag) {
          case 1:
          case 2:
          case 3:
              // do something
              break;
          case 4:
          case 5:
          case 6:
          case 7:
          case 8:
          case 9:
              // do something else
              break;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 2014-02-23
        • 2019-04-24
        • 2013-01-15
        相关资源
        最近更新 更多