【问题标题】:iOS can't alloc new object in switch case [duplicate]iOS无法在switch case中分配新对象[重复]
【发布时间】:2014-04-23 18:23:58
【问题描述】:

我有一个这样的开关盒:

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

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

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

谢谢。

【问题讨论】:

  • switch语句的所有情况下的所有语句都在同一个范围内,所以当你在一个情况下声明一个具有名称的变量,然后你在另一个情况下声明一个具有相同名称的变量时,您实际上是在进行两次声明。错误不在分配或定义中,而是在声明中。您可以使用花括号在每种情况下创建一个新范围,或者您只需在switch 之前声明一次变量,然后将分配推迟到case

标签: ios objective-c switch-statement


【解决方案1】:

啊哈……

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

如:

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

希望对您有所帮助。

【讨论】:

  • 我已经完成了目标 C/Xcode BS。
  • 很好的解决方案:D
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    最后,只有 statements 而不是 declarations 可以被标记,并且由于 case ...: 是一种标签形式,因此不能紧跟一个声明 - 所以你不能用声明开始一个“分支”。

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

    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    
    

    HTH

    【讨论】:

    • 优秀而彻底的答案。 (已投票)
    【解决方案4】:

    尝试这样做:

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

    }

    【讨论】:

      【解决方案5】:

      使用一些大括号:

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

      【讨论】:

        【解决方案6】:

        在 switch 中,case 的作用类似于块,因此您可能需要设置 { }。如果使用 ARC,则不需要显式分配 NSString。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 2019-04-01
          • 2015-08-02
          • 2020-02-21
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          相关资源
          最近更新 更多