2009-07-12 123 views
54

我想我會失明,因爲我無法揣摩出的語法錯誤是在此代碼:我可以在Objective-C switch語句中聲明變量嗎?

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

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

當我嘗試編譯它,我發現了一個錯誤:語法錯誤在最後一行'*'標記之前。

對不起,這是一個基本的問題,但我錯過了什麼?

+1

什麼樣的變量是cellNumber? switch語句來自C語言,因此使用Objective-C類型可以將其啓動。 – 2009-07-12 04:29:02

+1

C只支持`switch/case`類似於整數的對象,如果這是個問題,我期望得到一個不同的錯誤信息。 – ephemient 2009-07-12 04:32:44

+0

Objective-C是否遵循C99(和C++)並允許您在任何地方聲明變量,或者只能在塊的開始處這樣做?如果你不得不在塊的開始處聲明它們,那麼你可以在case'1'的``:''和匹配的'`}之後加一個``{`'來修正你的語法錯誤。 「在案件結束之前。 – 2009-07-12 04:35:45

回答

66

我不手頭上有合適的目標C編譯器,但只要C構造是相同的:

switch { … }給你一個塊級範圍,而不是爲每個case。在範圍的開頭以外的任何地方聲明一個變量是非法的,並且在switch內部是,特別是危險,因爲它的初始化可能被跳過。

執行以下任一操作可以解決問題嗎?

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

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

在switch塊中聲明一個變量可能不合適嗎?

20

您不能在case語句開頭聲明一個變量。製作一個測試用例,並且你會得到相同的錯誤。

它不需要在塊的中間聲明變量 - 即使採用了一個標準,它不會讓GCC在case語句開頭接受聲明。看來GCC將案例標籤看作是該行的一部分,因此不會在那裏進行聲明。

一個簡單的解決方法就是在該案例的開頭處放一個分號,以便聲明不在開頭。

4

在C語言中,只能在任何非聲明語句之前的塊的開頭聲明變量。

{ 
    /* you can declare variables here */ 

    /* block statements */ 

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

在C++中,您可以在任何需要它們的地方聲明變量。

0

如何解決警告:

1.Insert一個;你的情況塊的第一行

2.Put碼在大括號

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; 

} 
相關問題