我可以在Objective-C switch语句中声明变量吗?

时间:2009-07-12 04:22:53

标签: objective-c switch-statement

我想我会失明,因为我无法弄清楚此代码中语法错误的位置:

if( cell == nil ) {
    titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero
        reuseIdentifier:CellIdentifier ] autorelease
    ];

    switch( cellNumber ) {
        case 1:
            NSString *viewDataKey = @"Name";
etc...

当我尝试编译它时,我在最后一行的'*'token 之前收到错误:语法错误。

对不起这个基本问题,但我错过了什么?

6 个答案:

答案 0 :(得分:69)

我手边没有合适的Objective-C编译器,但只要C构造相同:

switch { … }为您提供一个块级范围,而不是每个case一个范围。在范围开头以外的任何地方声明变量是非法的,并且switch内的特别是危险的,因为它的初始化可能会被跳过。

请执行以下任一方法解决问题吗?

NSString *viewDataKey;
switch (cellNumber) {
    case 1:
        viewDataKey = @"Name";
    …
}

switch (cellNumber) {
    case 1: {
        NSString *viewDataKey = @"Name";
        …
    }
    …
}

答案 1 :(得分:20)

您不能在case语句的开头声明变量。制作一个仅包含该测试用例的测试用例,您将得到相同的错误。

它与在块中间声明的变量无关 - 即使采用允许GCC在case语句开头接受声明的标准也是如此。似乎GCC将案例标签视为该行的一部分,因此不允许在那里进行声明。

一个简单的解决方法是在案例的开头添加分号,因此声明不在开头。

答案 2 :(得分:4)

在C中,您只能在任何非声明语句之前在块的开头声明变量。

{
   /* you can declare variables here */

   /* block statements */

   /* You can't declare variables here */
}

在C ++中,您可以在需要的地方声明变量。

答案 3 :(得分:1)

在交换机块中声明变量可能无效吗?

答案 4 :(得分:1)

您可以在switch语句中创建变量,但是您必须在块中创建它,以便定义该变量的范围。

示例:

switch(number){

    case 1:
        {
            // Create object here
            // object is defined only for the scope of this block
        }
        break;
    case 2:
        {
            // etc.
        }
        break;
    default:
        break;

}

答案 5 :(得分:0)

如何解决警告:

1.在案例块的第一行插入一个;

2.在大括号内输入代码