【问题标题】:Switch-Case Statement and Range of NumbersSwitch-Case 语句和数字范围
【发布时间】:2011-11-18 00:44:36
【问题描述】:

有没有办法在 Objective C(在 XCode 中)中使用带有范围的 switch 语句,假设是这样的:

- (NSString *)evaluate:(NSInteger)sampleSize
{
       NSString returnStr;
       switch (sampleSize)
           {
               case sampleSize < 10: 
               returnStr = @"too small!";
               break;

               case sampleSize >11 && sampleSize <50:
               returnStr = @"appropriate";
               break;

               case sampleSize >50:
               returnStr = @"too big!";
               break;
           }
       return returnStr;
}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    有一个可能适合您的 GCC 扩展(我假设 Clang 支持该扩展)。它允许您在 case 语句中使用范围。完整文档位于http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges - 该页面的示例案例陈述是

    case 1 ... 5:
    

    将匹配(不出所料)1、2、3、4 或 5。

    【讨论】:

    • 我在阅读这里的代码时刚刚了解了这种语法:github.com/atebits/OAuthCore/blob/master/OAuth%2BAdditions.m——希望我很久以前就知道了。
    • 椭圆周围的空格是必需的,以免解析器尝试将数字解释为双精度数。
    • 请注意,这不适用于变量,它需要恒定的整数边界作为范围。
    【解决方案2】:

    不,switch 语句适用于大多数语言中的常量值...您能得到的最接近的方法是像这样将这些案例流到另一个案例中:

    switch(sampleSize)
    {
        case 0:
        case 1:
        case 2:
            returnStr = @"too small!";
            break;
    }
    

    或者,this 问题可能会有所帮助...

    编辑:我只是想到了另一种方法:您可以像这样在 .h 文件中“#define”大量案例:

    #define TOO_LOW     case 0: \
                        case 1: \
                        case 2: \
                        case 3:
    

    然后像这样在开关中使用它:

    switch(sampleSize)
    {
        TOO_LOW
            returnStr = @"too small!";
            break;
    }
    

    当然,这不是最干净的解决方案。 3 个“if/else”有什么问题?

    【讨论】:

    • 好吧,只有在选项数量有限的情况下才有效。如果我想像那样从 1 到 50,那么使用 switch-case 真的没有意义。我想也许还有其他一些方法可以绕过带有范围的 switch-case。
    • 是的,我认为你在这种情况下不走运。
    【解决方案3】:
    - (NSString *)evaluate:(NSInteger)sampleSize
    {
           NSString returnStr;
           switch (sampleSize)
               {
    
        //    for sampleSize between 0 and 10
    
                   case 0 ... 10: 
                   returnStr = @"too small!";
                   break;
    
        //    for sampleSize between 11 and 50
    
                   case 11 ... 50:
                   returnStr = @"appropriate";
                   break;
    
        //    for sampleSize above 50
    
                   case 50 :
                   case default:
                   returnStr = @"too big!";
                   break;
               }
           return returnStr;
    }
    

    请注意:这是我制定的解决方案,但如果 sampleSize 的 h 值小于 0,则不会计算在内。

    【讨论】:

      【解决方案4】:

      在你的 switch 语句中像下面的代码一样简单地传递 true

      - (NSString *)evaluate:(NSInteger)sampleSize {
         NSString returnStr;
         switch (true)
             {
                 case sampleSize < 10: 
                 returnStr = @"too small!";
                 break;
      
                 case sampleSize >11 && sampleSize <50:
                 returnStr = @"appropriate";
                 break;
      
                 case sampleSize >50:
                 returnStr = @"too big!";
                 break;
             }
         return returnStr;
      

      }

      这会解决你的问题

      【讨论】:

      • 我会告诉你我希望这行得通。但它没有:我只是测试了它。我不相信投反对票,但老兄在发帖前检查你的答案。 "表达式不是整数常量表达式"