开关案例声明和数字范围

时间:2011-11-18 00:44:37

标签: objective-c

有没有办法在目标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;
}

4 个答案:

答案 0 :(得分:40)

可能适合您的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。

答案 1 :(得分:4)

不,在大多数语言中,switch语句都是常量值...你可以得到的最接近的是将这些案例流入另一个:

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

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

编辑:我只是想到了另一种方式:你可以“#define”.h文件中的大型案例列表如下:

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

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

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

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

答案 2 :(得分: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,则无法计算。

答案 3 :(得分:-7)

只需在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;

}

这将解决您的问题