एआरसी का उपयोग करने के लिए एक परियोजना को परिवर्तित करते समय "स्विच केस संरक्षित दायरे में है" का क्या मतलब है?


283

एआरसी का उपयोग करने के लिए एक परियोजना को परिवर्तित करते समय "स्विच केस संरक्षित दायरे में है" का क्या मतलब है? मैं ARC का उपयोग करने के लिए Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC ... का उपयोग करते हुए एक परियोजना को परिवर्तित कर रहा हूं ... मुझे प्राप्त होने वाली त्रुटियों में से एक स्विच के "कुछ" पर "स्विच केस संरक्षित क्षेत्र में है" है एक स्विच केस।

संपादित करें, यहाँ कोड है:

ERROR को "डिफ़ॉल्ट" मामले पर चिह्नित किया गया है:

- (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;
}

जवाबों:


651

ब्रेसिज़ के साथ ही प्रत्येक मामले को घेरें {}। उस मुद्दे को ठीक करना चाहिए (यह मेरे लिए मेरी एक परियोजना में था)।


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

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

2
मैं उसी मुद्दे में भाग गया। यह एक भयानक त्रुटि संदेश है और इसे ठीक करने के लिए एक बग दायर किया गया है (जिसे कंपाइलर के भविष्य के संस्करण में तय किया जाएगा)। लेकिन, हां, C में केस स्टेटमेंट्स के भीतर की डांट-फटकार के नियम वास्तव में बहुत ही अजीब हैं।
bbum

59
ऐसा इसलिए हो रहा है क्योंकि आप एक मामले के दायरे में एक नया चर घोषित कर रहे हैं। कंपाइलर को यह नहीं पता है कि इस चर को कैसे स्कूप किया जाना चाहिए (क्या यह सभी स्विचेस के मामलों का है या सिर्फ करंट केस का है?) ब्रैकेट में केस के कार्यान्वयन को लपेटने से वैरिएबल में रहने की गुंजाइश बन जाती है ताकि कंपाइलर ठीक से मैनेज कर सके यह जीवन भर है।
शिनहारा

1
ध्यान दें कि ऐसा तब भी हो सकता है जब किसी घुंघराले ब्रेसिज़ के साथ ब्लॉक स्टेटमेंट के भीतर एक वैरिएबल की घोषणा की जाए। वह एक या दो मिनट के लिए एक सिर खरोंच था। =)
१16:

14

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


9

इस समस्या को हल करने के 2 आसान तरीके हैं:

  • आप शायद चर घोषित कर रहे हैं। स्विच स्टेटमेंट के बाहर चर की घोषणा को स्थानांतरित करें
  • घुंघराले कोष्ठक के बीच पूरे मामले को रखें {}

कंपाइलर कोड लाइन की गणना नहीं कर सकता है जब चर जारी किए जाने हैं। जिससे यह त्रुटि हुई।


5

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

NSDate *start = [NSDate date];

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


वही चीज; बीच में मामला त्रुटि। मुझे केवल स्विच के ऊपर चर घोषणा को स्थानांतरित करना था (यह निर्भर नहीं था)। मुझे मामलों (इस समय) के आसपास ब्रेसिज़ नहीं जोड़ना था।
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;

}

2

स्विच के बाहर चर को घोषित करें, फिर उन्हें मामले के अंदर त्वरित करें। मेरे लिए पूरी तरह से काम किया Xcode 6.2 का उपयोग करना


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

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


0

केस स्टेटमेंट और प्रत्येक मामले में ब्रेक{} के बीच कोड को ब्रेसिज़ से घिरा हुआ है । इसने मेरे कोड पर काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.