কোনও প্রকল্পকে এআরসি ব্যবহার করতে রূপান্তর করার সময় "স্যুইচ কেস সুরক্ষিত স্কোপে থাকে" এর অর্থ কী?


283

কোন প্রকল্পকে এআরসি ব্যবহার করতে রূপান্তর করার সময় "স্যুইচ কেসটি সুরক্ষিত স্কোপে থাকে" এর অর্থ কী? আমি এক্সকোড 4 সম্পাদনা -> রিফ্যাক্টর -> অবজেক্টিভ-সি এআরসিতে রূপান্তরিত করে এআরসি ব্যবহারের জন্য একটি প্রকল্প রূপান্তর করছি ... আমি যে ত্রুটি পেয়েছি তা হ'ল "সুইচ কেস সুরক্ষিত স্কোপে রয়েছে" এর কিছু "স্যুইচ" একটি সুইচ কেস

সম্পাদনা করুন, কোডটি এখানে:

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
ধনুর্বন্ধনী সংকলক সুযোগ বুঝতে সাহায্য করে। আমি জানি যে আপনি যদি বন্ধনীগুলি ছাড়াই কেস স্টেটমেন্টের প্রথম লাইনে একটি নতুন ভেরিয়েবল ঘোষণা করেন, এবং এআরসি-তে ডাব্লুডাব্লুডিসি 2011 ভিডিওতে বন্ধনীগুলির মধ্যে কেসগুলি বন্ধ করার বিষয়ে কিছু উল্লেখ রয়েছে। আপনি যদি কেন জানতে চান তবে সেই ভিডিওটি দেখুন — আমি আমার মাথার উপরের অংশটি মনে করতে পারি না।
FeifanZ

87
এটি একটি সময় হয়ে গেছে, তবে আমি সি স্ট্যান্ডার্ডের এমন কিছু মনে করি যা কেস স্টেটমেন্টের পরে পরিবর্তনশীল অ্যাসাইনমেন্টের অনুমতি দেয় না কারণ কোডটি আসলে কোনও ব্লকের ভিতরে নেই। কোঁকড়া ধনুর্বন্ধনী যোগ করে {...}পরে caseআগে break, সবকিছু ভিতরে বিশ্লেষণ করা ব্লক এবং আশানুরূপ আচরণ করবে। আমি এই বিষয়টিতে পৌঁছেছি যে caseএই ধরণের সমস্যা এড়াতে আমি স্বয়ংক্রিয়ভাবে আমার বিবৃতি থেকে একটি ব্লক তৈরি করেছি ।
পল

2
আমি একই ইস্যু মধ্যে দৌড়ে। এটি একটি ভয়াবহ ত্রুটি বার্তা এবং এটি সংশোধন করার জন্য একটি বাগ ফাইল করা হয়েছে (যা সংকলকের ভবিষ্যতের সংস্করণে স্থির করা হবে)। তবে, হ্যাঁ, সি-র ক্ষেত্রে স্টেটমেন্টের মধ্যে থাকা বিধি-বিধানগুলি আসলে খুব ... বিজোড়।
বুবুম

59
এটি ঘটছে কারণ আপনি একটি মামলার ক্ষেত্রের মধ্যে একটি নতুন ভেরিয়েবল ঘোষণা করছেন। সংকলকটি জানে না কীভাবে এই পরিবর্তনশীলটি স্কোপ করা উচিত (এটি কী সমস্ত সুইচ কেস বা কেবলমাত্র বর্তমান কেসের সাথে সম্পর্কিত?) কেসটির প্রয়োগটি বন্ধনীতে আবৃত রাখলে ভেরিয়েবলের মধ্যে বসবাসের সুযোগ সৃষ্টি হয় যাতে সংকলক সঠিকভাবে পরিচালনা করতে পারে এটা আজীবন
শিনোহারা

1
নোট করুন যে কোনও কোঁকড়ানো ধনুর্বন্ধনী সঙ্গে কেস স্টেটমেন্টের মধ্যে একটি ব্লকের মধ্যে ভেরিয়েবল ঘোষণার সময় এটিও ঘটতে পারে। এক বা দুই মিনিটের জন্য এটি হেড স্ক্র্যাচার ছিল। =)
স্লাইক্রেল

14

কোডটি না দেখে নিশ্চিত হওয়া শক্ত, তবে এর অর্থ সম্ভবত সুইচের অভ্যন্তরে কিছু পরিবর্তনশীল ঘোষণা চলছে এবং প্রয়োজনীয় ডেলোক পয়েন্টের একটি সুস্পষ্ট পথ আছে কিনা তা সংকলকটি বলতে পারবেন না।


9

এই সমস্যাটি সমাধান করার জন্য দুটি সহজ উপায় রয়েছে:

  • আপনি সম্ভবত ভেরিয়েবল ঘোষণা করছেন। ভেরিয়েবলের ঘোষণাকে স্যুইচ স্টেটমেন্টের বাইরে সরান
  • কোঁকড়ানো বন্ধনীগুলির মধ্যে পুরো কেসটি ব্লক করুন {Put

কম্পাইলার যখন ভেরিয়েবলগুলি প্রকাশ করতে হয় তখন কোড লাইন গণনা করতে পারে না। এই ত্রুটি ঘটায়।


5

আমার জন্য, সমস্যাটি একটি স্যুইচের মাঝামাঝি থেকে শুরু হয়েছিল এবং কোঁকড়ানো বন্ধনীগুলি কার্যকর হয়নি, যদি না আপনি সমস্ত পূর্ববর্তী কেস স্টেটমেন্টগুলিতে include include অন্তর্ভুক্ত না করেন। আমার কাছে ত্রুটিটি এলো যখন আমার বক্তব্য ছিল

NSDate *start = [NSDate date];

আগের ক্ষেত্রে। আমি এটি মুছে ফেলার পরে, তারপরে সমস্ত কেস স্টেটমেন্ট সুরক্ষিত স্কোপ ত্রুটি বার্তা থেকে পরিষ্কার হয়ে গেছে


একই জিনিস; মাঝখানে ক্ষেত্রে ত্রুটি। আমাকে কেবল পরিবর্তনশীল ঘোষণাটি স্যুইচের উপরে স্থানান্তরিত করতে হয়েছিল (এটি কেস নির্ভর ছিল না)। মামলার আশেপাশে আমাকে ব্রেসগুলি যুক্ত করতে হয়নি (এবার)।
eGanges

3

আগে:

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

আমি স্যুইচ করার আগে এনএসডিট সংজ্ঞাটি সরিয়েছি এবং এটি সংকলনের সমস্যাটি স্থির করেছে:

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

}

2

সুইচের বাইরে ভেরিয়েবলগুলি ঘোষণা করুন, তারপরে এগুলি কেসের অভ্যন্তরে ইনস্ট্যান্ট করুন। এটি আমার জন্য এক্সকোড .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;
    }

দ্রষ্টব্য: চেক! গা the় ও তির্যক লাইনের সিনট্যাক্স। এটি সংশোধন করুন এবং আপনি যেতে ভাল।


0

কেস স্টেটমেন্ট এবং প্রতিটি ক্ষেত্রে বিরতির মধ্যে {}কোডটি বক্ররেখার চারপাশে । এটি আমার কোডে কাজ করেছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.