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

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

if( cell == nil ) { titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier ] autorelease ]; switch( cellNumber ) { case 1: NSString *viewDataKey = @"Name"; etc... 

当我尝试编译它时,我在最后一行的'*'标记之前得到一个错误:语法错误

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

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

switch { … }给你一个块级别的范围,而不是每个case 。 在范围的开头以外的地方声明一个variables是非法的,而且在switch内部是特别危险的,因为它的初始化可能被跳过。

以下任何一项解决了这个问题?

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

您不能在case语句的开头声明一个variables。 做一个testing用例就是这个,你会得到同样的错误。

它并不需要在块中间声明variables – 即使采用了一个标准,它不会让GCC在一个case语句开始时接受一个声明。 看来,GCC将案件标签视为该行的一部分,因此不会在那里发表声明。

一个简单的解决方法就是在案例的开始处放一个分号,所以声明不在开头。

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

 { /* you can declare variables here */ /* block statements */ /* You can't declare variables here */ } 

在C ++中,你可以在需要的地方声明variables。

在开关块中声明一个variables可能不合适吗?

您可以在switch语句中创build一个variables,但是您必须在一个块中创build它,以便定义该variables的范围。

例:

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

如何解决警告:

1.插入一个; 在你的情况块的第一行

2.在大括号内编码