2009-11-19 20 views
6

मेरे कोड में मुझे एक ही स्विच स्टेटमेंट में एक अलग केस कूदने (गोटो) करने में सक्षम होना चाहिए। क्या इसे करने का कोई तरीका है?उद्देश्य-सी में स्विच स्टेटमेंट में मैं गोटो का उपयोग कैसे कर सकता हूं?

मेरे कोड कुछ इस तरह है:

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

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

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

default: 
break; 

}

अपने समय के लिए धन्यवाद (वहाँ कोड का एक बहुत मैं बस यह सब बाहर छोड़ दिया है)! -जेफ

+9

में के रूप में नहीं है, कि बहुत बुरा होगा कोडिंग अभ्यास: अन्य मामले में किया, एक अगर साथ यह की रक्षा करना। – zaph

+0

क्या आप एक मान हिट या किसी अन्य के लिए देख रहे हैं, तो वे दोनों कोड के समान मामले को चलाते हैं? यदि ऐसा है, तो आप बस सही मामले में आ सकते हैं। ।; लेकिन मामले (आईडी) इस { \t viewNumber = [इस टैग]: -: –

+0

कृपया सभी अतिरिक्त ब्रेसिज़ से छुटकारा पाने :( – KevinDTimm

उत्तर

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

धन्यवाद स्विच बयान एक विधि में है (IBAction) showViewAction # मैं प्रेषक से टैग आईडी का उपयोग कर रहा हूं। इसलिए जब उपयोगकर्ता टैग आईडी 500 के साथ एक बटन टैप करता है तो विधि उस टैग का उपयोग करती है, यह जानने के लिए कि किस मामले का उपयोग करना है। – Jeff

+1

तो यह विधि बहुत बड़ी होनी चाहिए! केस से कोड को हटा देना बयान और उन्हें अन्य तरीकों से डालने से चीजों को पढ़ने में आसान हो सकता है। इसके अलावा, यदि आपके पास स्थिर संख्या में बटन हैं, तो आप लक्ष्य-क्रिया का उपयोग करके प्रत्येक बटन को सीधे अपने तरीके से जोड़ सकते हैं। –

+0

जिस तरह से मैं इसे इस्तेमाल करता था मामलों में से प्रत्येक के लिए और आईबी में सभी के लिए एक अलग विधि एनएस "आईबीएक्शन" से जुड़े थे, लेकिन मेरे मालिक को लगता है कि कोड अलग-अलग तरीकों के बजाय स्विच स्टेटमेंट का उपयोग करते हुए "अधिक विश्वसनीय, सुरुचिपूर्ण, और तेजी से चलाया जाएगा"। तो आपकी कहानियां फिर से अलग तरीकों का उपयोग करना बेहतर होगा? इसके अलावा मैंने सुना है कि "गोटो" उपयोग करने में बुरा है ... क्या आप जानते हैं कि यह बुरा क्यों है? – Jeff

0

आपको शायद अपने कोड को फिर से लिखना चाहिए, जैसे रिकर्सिव कॉल या सामान्य सामान को कारक करना और एक अलग फ़ंक्शन कॉल करना। लेकिन एक फिक्स और अपने प्रश्न का त्वरित जवाब के रूप में आप तो

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

ऑब्जेक्टिव-सी वाक्य रचना यहाँ के बारे में सुनिश्चित नहीं की तरह अपने स्विच से पहले एक लेबल डाल सकता है और गोटो यह, है, लेकिन आप भी

उसके एक बदलाव की कोशिश कर सकते
int lastView = 0; 

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

जो दृश्य तक लूपिंग जारी रखेगा नम्बर अब और नहीं बदलता है। यद्यपि यह अभी भी एक सुंदर दिखने वाला गोटो है।

और चूंकि हम गेटोस कर रहे हैं, तो आप पहले से ही बताए गए एक और मामले में जा सकते हैं। आप अन्य ब्लॉकों के अंदर मामलों को डालकर, डफ के डिवाइस की तरह फैंसी सामान भी कर सकते हैं। लेकिन यह सिर्फ पागल है .. :)

+0

बहुत बहुत धन्यवाद! – Jeff

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 के उपयोग से बचने का व्यावहारिक कारण यह है कि आपको goto लेबल खोजने के लिए अपने swtich-case पेड़ से खोजना होगा।

यदि आपका स्विच तर्क बदलता है, तो आपके हाथों पर एक गन्दा स्थिति होगी।

यदि आप अपनी विधि में सामान्य कोड खींचते हैं, तो कोड को पढ़ने, डीबग और विस्तार करना आसान होता है।

-1

[मैं इस सवाल का जवाब समुदाय विकी बना रहा हूं क्योंकि यह वास्तव में इस सवाल का जवाब नहीं है दर असल]

के रूप में अन्य लोगों ने कहा, यह बहुत बुरा शैली है, और अपठनीय कोड के लिए बनाता है ...

विकल्प:

  1. फैक्टर एक अलग समारोह में आम कोड और कॉल कि 2 स्थानों में।
  2. गिरावट का उपयोग करें, किसी मामले पर ब्रेक को छोड़ दें और यह अगले के माध्यम से हो जाता है (याद रखें, मामलों को संख्यात्मक क्रम में नहीं होना चाहिए!)
  3. यदि आप केवल एक मामले का हिस्सा चाहते हैं

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

आपको जानकर बहुत अच्छा लगा – Jeff

संबंधित मुद्दे