2011-09-26 3 views
281

एआरसी का उपयोग करने के लिए एक परियोजना को परिवर्तित करते समय "स्विच केस संरक्षित क्षेत्र में क्या होता है" का मतलब है? मैं एक्सकोड 4 एडिट -> रिफैक्टर -> ऑब्जेक्टिव-सी एआरसी में कनवर्ट करने के लिए एआरसी का उपयोग करने के लिए एक प्रोजेक्ट को परिवर्तित कर रहा हूं ... मुझे मिली त्रुटियों में से एक "स्विच केस संरक्षित क्षेत्र में है" पर "कुछ" एक स्विच मामले में स्विच।एआरसी का उपयोग करने के लिए प्रोजेक्ट को कनवर्ट करते समय "स्विच केस सुरक्षित क्षेत्र में क्या होता है" का मतलब है?

त्रुटि "डिफ़ॉल्ट" इस मामले पर चिह्नित है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @""; 
    UITableViewCell *cell ; 
    switch (tableView.tag) { 
     case 1: 
      CellIdentifier = @"CellAuthor"; 
      cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
      if (cell == nil) { 
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     } 
     cell.textLabel.text = [[prefQueries objectAtIndex:[indexPath row]] valueForKey:@"queryString"]; 
     break; 
    case 2: 
     CellIdentifier = @"CellJournal"; 
     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     } 
     cell.textLabel.text = [[prefJournals objectAtIndex:[indexPath row]] valueForKey:@"name"]; 

     NSData * icon = [[prefJournals objectAtIndex:[indexPath row]] valueForKey:@"icon"]; 
     if (!icon) { 
      icon = UIImagePNGRepresentation([UIImage imageNamed:@"blank72"]); 
     } 
     cell.imageView.image = [UIImage imageWithData:icon]; 

     break; 

    default: 
     CellIdentifier = @"Cell"; 
     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
      } 
     break; 
    } 


    return cell; 
} 

उत्तर

653

प्रत्येक मामले को ब्रेसिज़ {} के साथ अपने आस-पास के आसपास रखें। इससे इस मुद्दे को ठीक करना चाहिए (यह मेरे लिए मेरी परियोजनाओं में से एक में किया गया था)।

+20

वाह! इसने काम कर दिया! लेकिन क्यों?! – Ali

+12

ब्रेसिज़ संकलक को समझने में मदद करते हैं।मुझे पता है कि जीसीसी ने चेतावनी जारी करने के लिए प्रयोग किया था यदि आपने ब्रेसिज़ के बिना केस स्टेटमेंट की पहली पंक्ति में एक नया चर घोषित किया था, और एआरसी पर डब्ल्यूडब्ल्यूडीसी 2011 वीडियो ब्रेसिज़ में मामलों को घेरने के बारे में कुछ बताता है। अगर आप जानना चाहते हैं, तो उस वीडियो को देखें- मैं अपने सिर के ऊपर से याद नहीं कर सकता। – FeifanZ

+87

यह एक समय हो गया है, लेकिन मैं सी मानक क्योंकि कोड वास्तव में एक ब्लॉक के अंदर नहीं है कि एक मामले बयान के बाद चर काम की अनुमति नहीं दी में कुछ याद करने लगते हैं। 'केस' के बाद और 'ब्रेक' से पहले घुंघराले ब्रेसिज़ '{...} 'जोड़कर, अंदर सबकुछ एक स्कॉप्ड ब्लॉक में है और उम्मीद के अनुसार व्यवहार करेगा। मुझे इस बात की समस्या है कि इस तरह की समस्या से बचने के लिए मैं अपने 'केस' कथन से स्वचालित रूप से एक ब्लॉक बना देता हूं। – Paul

14

हार्ड कोड को देखे बिना सुनिश्चित करने के लिए, लेकिन यह शायद मतलब है

संपादित करें, यहाँ कोड है स्विच के अंदर कुछ परिवर्तनीय घोषणा चल रही है और संकलक यह नहीं बता सकता कि आवश्यक डेलोक बिंदु के लिए कोई स्पष्ट पथ है या नहीं।

1
default: 
     CellIdentifier = @"Cell"; 
     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      ***initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];*** 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
      } 
     break; 
    } 

नोट: जांचें! बोल्ड & इटालिसिक लाइन का वाक्यविन्यास। इसे सुधारें और आप जाने के लिए अच्छे हैं।

5

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

NSDate *start = [NSDate date]; 

पिछले मामले में बयान दिया था। बाद मैं इस नष्ट कर दिया है, तो बाद के सभी मामले बयान संरक्षित गुंजाइश त्रुटि संदेश से साफ आया

+0

वही बात; बीच में मामला त्रुटि। मुझे केवल स्विच के ऊपर परिवर्तनीय घोषणा को स्थानांतरित करना पड़ा (यह मामला निर्भर नहीं था)। मुझे मामलों (इस बार) के आसपास ब्रेसिज़ जोड़ने की ज़रूरत नहीं थी। – eGanges

3

से पहले:

case 2: 
     NSDate *from = [NSDate dateWithTimeIntervalSince1970:1388552400]; 
     [self refreshContents:from toDate:[NSDate date]]; 
     break; 

मैं NSDate परिभाषा ले जाया स्विच से पहले, और यह संकलन समस्या तय:

NSDate *from; /* <----------- */ 
switch (index) { 
    .... 
    case 2: 
     from = [NSDate dateWithTimeIntervalSince1970:1388552400]; 
     [self refreshContents:from toDate:[NSDate date]]; 
     break; 

} 
9

इस मुद्दे को हल करने के लिए 2 आसान तरीके हैं:

  • आप शायद variab की घोषणा कर रहे हैं लेस। कर्ली कोष्ठक {}

जब चर रिलीज होने हैं संकलक कोड लाइन गणना नहीं कर सकते के बीच में पूरे मामले ब्लॉक रखो चर स्विच बयान

  • बाहर की घोषणा ले जाएँ। इस त्रुटि के कारण।

  • 2

    स्विच के बाहर चर को घोषित करें, फिर मामले के अंदर उन्हें तुरंत चालू करें। वह मेरे लिए पूरी तरह से काम किया ब्रेसिज़ {}मामला बयान और प्रत्येक मामले में तोड़ के बीच कोड के साथ Xcode 6.2

    0

    चारों ओर का उपयोग कर। यह मेरे कोड पर काम किया।

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

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