2009-11-19 31 views
6

在我的代碼中,我需要能夠在同一個switch語句中跳轉(goto)不同的情況。有沒有辦法做到這一點?如何在Objective-C的switch語句中使用goto?

我的代碼是這樣的:(有很多的代碼,我剛剛離開了這一切)

switch (viewNumber) { 
case 500: 
     // [...] 
break; 

case 501: 
     // [...] 
break; 
. 
. 
. 
. 
. 

case 510: 
     // [...] 
break; 

default: 
break; 

}

謝謝您的時間! -Jeff

+9

不要,那將是非常糟糕的編碼習慣:在其他情況下完成的,與是否保護它。 – zaph 2009-11-19 16:06:46

+0

您是否在尋找一個值是否匹配或者其他值,它們都運行相同的代碼大小?如果是這樣,你可以通過正確的案例。 。 – 2009-11-19 16:08:06

+0

擺脫所有多餘的括號,請:( – KevinDTimm 2009-11-19 16:22:35

回答

17

它一般是非常不好的做法要無條件跳躍,就像你問。

我認爲一個更可讀/可維護的解決方案將共享代碼放在一個方法中,並有多個案例調用該方法。

如果你真的想,你可以使用goto做這樣的事情:

switch(viewNumber) { 
    case 500: 
     // [...] 
     goto jumpLabel; 
    case 501: 
     // [...] 
     break; 
    case 502: 
     // [...] 
     jumpLabel: 
     // Code that 500 also will execute 
     break; 
    default:break; 
} 

注:我只提供上面的代碼示例來回答你的問題。我現在覺得很骯髒,我可能不得不買一些Bad Code Offsets

+0

謝謝switch語句是一個方法: - (IBAction爲)showViewAction:(ID)發送 { \t viewNumber = [發送方標籤]; 但案件#我現在用的就是發送方的標籤ID。因此,當用戶點擊與標籤ID 500的按鈕的方法使用該標籤知道使用什麼情況。 – Jeff 2009-11-19 16:14:35

+1

所以這個方法必須是巨大的!從'情況下刪除代碼'語句並把它們在其他方法可能會使事情更容易閱讀。另外,如果你有按鈕的靜態數量,你可以直接在每個按鈕以它自己的方法使用目標的行動聯繫起來。 – 2009-11-19 16:18:03

+0

我曾經有過它的方式針對每個案例和IB所有案例的單獨方法ns連接到「IBAction」,但我的老闆認爲如果我使用Switch語句而不是單獨的方法,代碼將「更可靠,更優雅,運行更快」。所以你說,再次使用單獨的方法會更好?我之前也聽說過「goto」不好用...你知道它爲什麼不好嗎? – Jeff 2009-11-19 16:28:19

0

你可能應該嘗試重寫你的代碼,就像遞歸調用或者只是將常見的東西分解並調用一個單獨的函數。但作爲一個修復和快速的回​​答你的問題,你可以把一個標籤交換機之前和GOTO它,像這樣

switchLabel: 
switch(viewNumber) { 
    case 500: { 
    viewNumber = 501; 
    goto switchLabel; 
    } 
} 

不知道這裏的Objective-C的語法,但你也可以嘗試其

變化
int lastView = 0; 

while (lastView != viewNumber) 
    switch(lastView = viewNumber) { 
    case 500: { 
     viewNumber = 501; 
     break; 
    } 
    } 

它將繼續循環,直到viewNumber不再改變。儘管如此,這仍然非常漂亮。正如已經指出的那樣,由於我們正在做gotos,你可以轉到另一個案例。你也可以做一些類似於達夫設備的花哨的東西,把盒子放在其他的塊裏面。但這只是瘋了.. :)

+0

非常感謝! – Jeff 2009-11-19 16:29:13

4

而不是使用goto,重構您的代碼,以便兩個(或多個)使用通用代碼的情況,而不是使用通用的方法調用它。

喜歡的東西:

switch (value) { 
    case (firstValue): 
     // ... 
     break; 
    case (secondValue): 
     [self doSharedCodeForSecondAndThirdValues]; 
     break; 
    case (thirdValue): 
     [self doSharedCodeForSecondAndThirdValues]; 
     break; 
    default: 
     break; 
} 

// ... 

- (void) doSharedCodeForSecondAndThirdValues { 
    // do stuff here that is common to second and third value cases 
} 

這不會是世界末日使用goto,雖然它是不好的做法。

避免使用goto的實際原因是,你必須通過你的swtich-case樹搜索發現goto標籤。

如果你的開關邏輯改變了,你的手上就會出現一個混亂的情況。

如果您將通用代碼提取到自己的方法中,代碼更易於讀取,調試和擴展。

-1

[我在做這個答案社區維基,因爲這實際上並沒有回答這個問題本身]

正如其他人所說,這是非常糟糕的風格,併爲不可讀代碼...

備選方案:

  1. 因子的共同代碼到一個單獨的函數,並調用在2個地方。
  2. 使用fallthroughs,離開案件的休息,並通過下一個(請記住,案件不必以數字​​順序!)
  3. 如果您只希望部分案件是

case 500: 
. 
. 
. 
case 501: 
    if(viewNumber == 501) { 
    . 
    . 
    . 
    } 
    . 
    . 
    . 
    break; 
+0

很高興知道謝謝 – Jeff 2009-11-19 16:35:45