iOS无法在switch case中分配新对象

时间:2014-04-23 18:23:59

标签: ios objective-c switch-statement

我有一个像这样的开关盒:

  switch ([weatherCode intValue]) {
       case 1:
           ...
           break;
       case 2:
           ....
           break;
  }

但是我希望在这种情况下分配一个对象,比如NSString *string = @"hello";

但是它一直给我一个错误expect expression我根本不明白发生了什么。请帮忙。

感谢。

6 个答案:

答案 0 :(得分:71)

... AHA

之前我遇到过同样的问题,只需在你的情况下添加一个{},你的所有问题都将得到解决。

如:

switch ([weatherCode intValue]) {
   case 1:
   {
      ...
   }
       break;
   case 2:
   {
      ...
   }          
   break;
}

希望有所帮助。

答案 1 :(得分:7)

如果你想要初始化变量,你需要大括号:

switch ([weatherCode intValue]) {
       case 1:{
           NSString *string = @"hello";
       }
       break;
       case 2: {
           ....
       }
       break;
  }

答案 2 :(得分:3)

尝试这样做:

switch ([weatherCode intValue]) {
   case 1: {
       ...
   }
   break;
   case 2: {
       ....
   }
   break;
   ...

}

答案 3 :(得分:3)

在(目标 - )C(++)中,语句 while(...) { ... }for(...) { ... }switch(...) { ...}等包含一个块语句< / em>(if (...) { ... } else { ... }包含两个)。块中声明的范围就是那个块,在块中声明两次相同的变量是错误的。

switch的块包含许多case ...: 标签 - 标签不会分隔块,它们只是控制流可以跳转到的块内的点。这使得C中的switch语句与每个分支独立的其他语言中的if/else语句不同(因为switch中的两个块在C中是独立的)。 C break;只是一个&#34;计算的转到&#34;成一个块。这就是if/else语句存在的原因,如果没有它,控制流只会从一个&#34;分支继续进行。到下一个。

另一个结果是,与case ...:语句不同,不同的分支不能声明相同的变量名。

最后只能标记语句而不是声明,并且由于if/else是一种标签形式,因此不能立即跟随一个声明 - 所以你无法启动&#34;分支&#34;声明。

如果您希望在分支中声明的变量仅用于该分支(如果在{ ... }的任一块中声明它们),那么您可以通过封闭所有问题来解决所有问题大括号switch (expr) { case 1: { NSString *var; // use var break; } case 2: { NSNumber *var; // use var break; } ... } // no var here 中的分支,使其成为块语句 - 可以标记块,并且可以包含本地声明。例如。类似的东西:

switch

如果要分配在switch之后需要使用的变量,则必须在switch之前声明它们,因为NSString *var = nil; switch (expr) { case 1: ... var = ...; break; case 2: ... var = ...; break; ... } // use var here 的主体是块,因此地方申报范围。例如。类似的东西:

{{1}}

HTH

答案 4 :(得分:2)

使用一些大括号:

switch ([weatherCode intValue]) {
       case 1:{
           NSString *string = @"hello";
       }
           break;
       case 2:{
           NSString *string = @"hello";
       }
           break;
  }

答案 5 :(得分:1)

在交换机中,大小写就像阻塞一样,因此您可能需要设置{}。如果使用ARC,则不需要显式分配NSString。

switch ([weatherCode intValue]) {
   case 1:
   {
      //your code for case 1
   }
       break;
   case 2:
   {
      //your code for case 2
   }          
   break;
}