2014-04-23 10 views
9

मैं इस तरह एक स्विच मामला है:आईओएस स्विच मामले में नई वस्तु alloc नहीं कर सकते

switch ([weatherCode intValue]) { 
     case 1: 
      ... 
      break; 
     case 2: 
      .... 
      break; 
    } 

लेकिन मैं उस मामले में एक वस्तु alloc करने के लिए, की तरह NSString *string = @"hello";

चाहते हैं, लेकिन इसे रखने के लिए मुझे देता है एक त्रुटि expect expression जो मुझे समझ में नहीं आता कि क्या हो रहा है। कृपया मदद करे।

धन्यवाद।

+0

एक स्विच बयान के सभी मामलों में सभी बयान एक ही दायरे में हैं, इसलिए जब आप एक मामले में एक नाम के साथ एक चर घोषित, और फिर आप एक घोषित: की तर्ज पर कुछ एक अलग नाम के तहत एक ही नाम के साथ चर, आप प्रभावी रूप से दो बार घोषणा कर रहे हैं। त्रुटि आवंटन या परिभाषा में नहीं है, यह घोषणा में है। आप या तो प्रत्येक मामले में एक नया दायरा बनाने के लिए घुंघराले ब्रेसिज़ का उपयोग करते हैं, या आप 'स्विच' से पहले एक बार अपना वैरिएबल घोषित करते हैं, और' केस' तक असाइन करना स्थगित करते हैं। – iluvcapra

उत्तर

70

अहा ...

मैं पहले की तरह ही समस्या थी, बस अपने मामले में एक {} जोड़ने के लिए, अपने सभी समस्या का समाधान कर दिया जाएगा।

जैसे:

switch ([weatherCode intValue]) { 
    case 1: 
    { 
     ... 
    } 
     break; 
    case 2: 
    { 
     ... 
    }   
    break; 
} 

आशा है कि मदद करता है।

+4

मैं उद्देश्य सी/एक्सकोड बीएस के साथ ऐसा कर रहा हूं। – Tommyixi

+0

^^^^^^^^^^^^^^^^ –

+0

महान समाधान: डी –

7

आप ब्रेसिज़ की जरूरत है अगर आप आरंभ चर हैं:

switch ([weatherCode intValue]) { 
     case 1:{ 
      NSString *string = @"hello"; 
     } 
      break; 
     case 2:{ 
      NSString *string = @"hello"; 
     } 
      break; 
    } 
2

कुछ ब्रेसिज़ का प्रयोग करें स्विच, मामलों ब्लो की तरह काम करता है सीके ताकि आपको {} सेट करने की आवश्यकता हो। एआरसी का उपयोग करते समय आपको एनएसएसटींग को स्पष्ट रूप से आवंटित करने की आवश्यकता नहीं है।

switch ([weatherCode intValue]) { 
    case 1: 
    { 
     //your code for case 1 
    } 
     break; 
    case 2: 
    { 
     //your code for case 2 
    }   
    break; 
} 
3

इस तरह यह कर का प्रयास करें::

switch ([weatherCode intValue]) { 
    case 1: { 
     ... 
    } 
    break; 
    case 2: { 
     .... 
    } 
    break; 
    ... 

}

1

में

switch ([weatherCode intValue]) { 
     case 1:{ 
      NSString *string = @"hello"; 
     } 
     break; 
     case 2: { 
      .... 
     } 
     break; 
    } 
3

में (Objective-) सी (++) बयानwhile(...) { ... }, for(...) { ... }, switch(...) { ...} आदि एक भी ब्लॉक बयान (if (...) { ... } else { ... } दो शामिल हैं) होते हैं। ब्लॉक के भीतर घोषणाओं का दायरा केवल उस ब्लॉक है, और यह ब्लॉक के भीतर दो बार समान वैरिएबल घोषित करने में त्रुटि है।

एक switch के ब्लॉक case ...:लेबल के एक नंबर शामिल हैं - लेबल ब्लॉक परिसीमित नहीं है, वे कर रहे हैं सिर्फ एक ब्लॉक है कि प्रवाह पर जा सकते हैं को नियंत्रित भीतर इंगित करता है। यह switch सी में कुछ अन्य भाषाओं की तुलना में भिन्न है जहां प्रत्येक शाखा स्वतंत्र है (क्योंकि if/else में दो ब्लॉक सी में स्वतंत्र हैं)। एक सी switch एक ब्लॉक में सिर्फ "गणना गोटो" है। यही कारण है कि break; कथन मौजूद है, इसके बिना नियंत्रण प्रवाह केवल एक "शाखा" से अगले तक जारी है।

इसका एक अन्य परिणाम यह है कि अलग-अलग शाखाएं उसी चर नामों की घोषणा नहीं कर सकती हैं, if/else कथन के विपरीत।

अंत में केवल बयान और नहीं घोषणाओं लेबल किया जा सकता है, और एक case ...: के रूप में लेबल का एक रूप है वहाँ तुरंत एक के बाद एक घोषणा नहीं हो सकता - तो आप एक घोषणा के साथ एक "शाखा" शुरू नहीं कर सकते।

यदि वे शाखाएं जो आप शाखा में घोषित करना चाहते हैं, केवल उस शाखा में उपयोग के लिए हैं (जैसे कि if/else के ब्लॉक में से किसी एक में घोषित किया जाएगा) तो आप ब्रेसिज़ में शाखा को संलग्न करके सभी समस्याओं को हल कर सकते हैं , { ... }, इसे ब्लॉक कथन में बनाने के लिए - ब्लॉक को लेबल किया जा सकता है और इसमें स्थानीय घोषणाएं हो सकती हैं। जैसे की तर्ज पर कुछ:

switch (expr) 
{ 
    case 1: 
     { 
     NSString *var; 
     // use var 
     break; 
     } 

    case 2: 
     { 
     NSNumber *var; 
     // use var 
     break; 
     } 

    ... 
} 
// no var here 

आप, चर जो आप switch के बाद उपयोग करने की आवश्यकता है तो आप उन्हें switch से पहले घोषित करना चाहिए करने के लिए बताए रहे हैं, तो के रूप में एक switch के शरीर एक ब्लॉक एक स्थानीय घोषणा है और इसलिए गुंजाइश। जैसे

NSString *var = nil; 
switch (expr) 
{ 
    case 1: 
     ... 
     var = ...; 
     break; 

    case 2: 
     ... 
     var = ...; 
     break; 

    ... 
} 
// use var here  

HTH

+0

उत्कृष्ट, संपूर्ण उत्तर। (मतदान किया) –

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