Can I declare variables inside an Objective-C switch statement?

Objective CSwitch Statement

Objective C Problem Overview


I think I'm going blind, because I can't figure out where the syntax error is in this code:

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

When I try to compile it, I'm getting an Error: syntax error before '*' token on the last line.

Sorry for such a basic question, but what am I missing?

Objective C Solutions


Solution 1 - Objective C

I don't have a suitable Objective-C compiler on hand, but as long as the C constructs are identical:

switch { … } gives you one block-level scope, not one for each case. Declaring a variable anywhere other than the beginning of the scope is illegal, and inside a switch is especially dangerous because its initialization may be jumped over.

Do either of the following resolve the issue?

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

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

Solution 2 - Objective C

You can't declare a variable at the beginning of a case statement. Make a test case that just consists of that and you'll get the same error.

It doesn't have to do with variables being declared in the middle of a block — even adopting a standard that allows that won't make GCC accept a declaration at the beginning of a case statement. It appears that GCC views the case label as part of the line and thus won't allow a declaration there.

A simple workaround is just to put a semicolon at the beginning of the case so the declaration is not at the start.

Solution 3 - Objective C

In C you only can declare variables at the begining of a block before any non-declare statements.

{
   /* you can declare variables here */

   /* block statements */

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

In C++ you can declare variables any where you need them.

Solution 4 - Objective C

You can create a variable within a switch statement but you will have to create it within a block so that the scope of that variable is defined.

Example:

switch(number){

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

}

Solution 5 - Objective C

Might it not be valid to declare a variable within a switch block?

Solution 6 - Objective C

How to solve the warning:

1.Insert one ; in the first line of your case block

2.Put codes inside braces

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoBu1324View Question on Stackoverflow
Solution 1 - Objective CephemientView Answer on Stackoverflow
Solution 2 - Objective CChuckView Answer on Stackoverflow
Solution 3 - Objective CAragornView Answer on Stackoverflow
Solution 4 - Objective CegarlockView Answer on Stackoverflow
Solution 5 - Objective CPhil MillerView Answer on Stackoverflow
Solution 6 - Objective Clin zhengView Answer on Stackoverflow