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

use*_*470 11 objective-c switch-statement ios

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

  switch ([weatherCode intValue]) {
       case 1:
           ...
           break;
       case 2:
           ....
           break;
  }
Run Code Online (Sandbox Code Playgroud)

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

但它一直给我一个错误expect expression,我不明白发生了什么.请帮忙.

谢谢.

Xu *_*Yin 73

啊哈...

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

如:

switch ([weatherCode intValue]) {
   case 1:
   {
      ...
   }
       break;
   case 2:
   {
      ...
   }          
   break;
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 我完成了目标C/Xcode BS. (5认同)

Gre*_*reg 7

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

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


CRD*_*CRD 5

在(Objective-)C(++)的语句 while(...) { ... }for(...) { ... }switch(...) { ...}等含有单块语句if (...) { ... } else { ... }包含两个)。一个块内声明的范围就是那个块,在一个块内声明同一个变量两次是错误的。

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

这样做的另一个后果是不同的分支不能声明相同的变量名,这与 forif/else语句不同。

最后,只能标记语句而不是声明,并且作为case ...:标签的一种形式,不能在声明之后紧跟声明 - 因此您不能用声明开始“分支”。

如果您希望在分支中声明的变量仅在该分支中使用(就像在 an 的任何一个块中声明一样if/else),那么您可以通过将分支括在大括号中来解决所有问题, { ... }, 使其成为进入块语句 - 块可以被标记并且可以包含局部声明。例如:

switch (expr)
{
   case 1:
      {
         NSString *var;
         // use var
         break;
      }

   case 2:
      {
         NSNumber *var;
         // use var
         break;
      }

   ...
}
// no var here
Run Code Online (Sandbox Code Playgroud)

如果要分配给需要在 theswitch之后使用的变量,则必须在 之前声明它们switch,因为 a 的主体switch是一个块,因此是一个局部声明范围。例如:

NSString *var = nil;
switch (expr)
{
   case 1:
      ...
      var = ...;
      break;

   case 2:
      ...
      var = ...;
      break;

   ...
}
// use var here    
Run Code Online (Sandbox Code Playgroud)

HTH