গণনাযোগ্য অবজেক্টস ইউজিংব্লকের জন্য BOOL * স্টপ আর্গুমেন্ট কী: এর জন্য ব্যবহৃত হয়?


87

আমি enumerateObjectsUsingBlock:আমার দ্রুতগতিতে প্রয়োজনের জন্য ইদানীং প্রচুর ব্যবহার করছি, এবং BOOL *stopগণনা ব্লকের ব্যবহার বুঝতে আমার খুব কষ্ট হচ্ছে ।

NSArrayশ্রেণী রেফারেন্স রাজ্যের

stop: একটি বুলিয়ান মান একটি রেফারেন্স। YESঅ্যারেটির আরও প্রসেসিং বন্ধ করতে ব্লকটি মান নির্ধারণ করতে পারে। stopযুক্তি বাইরে শুধুমাত্র যুক্তি। আপনার কেবলমাত্র এই বুলিয়ানটিকে YESব্লকের মধ্যে সেট করা উচিত ।

সুতরাং অবশ্যই আমি অঙ্কটি বন্ধ করতে আমার ব্লকে নিম্নলিখিতগুলি যুক্ত করতে পারি:

if (idx == [myArray indexOfObject:[myArray lastObject]]) {
    *stop = YES;
}

আমি কি বলতে পারবে চলেছি থেকে স্পষ্টভাবে সেটিং না *stopকরতে YESকোনো নেতিবাচক পার্শ্ব-প্রতিক্রিয়া নেই। অঙ্কটি অ্যারের শেষে স্বয়ংক্রিয়ভাবে নিজেকে থামিয়ে দেবে বলে মনে হচ্ছে। সুতরাং *stopএকটি ব্লক সত্যিই প্রয়োজনীয় ব্যবহার করা হয় ?

উত্তর:


156

stopসূচীতে যুক্তি আপনি শুমার বন্ধ করতে পারবেন অকালে । এটি breakএকটি সাধারণ forলুপ থেকে সমতুল্য । আপনি অ্যারেতে প্রতিটি বস্তুর মধ্য দিয়ে যেতে চাইলে আপনি এটিকে উপেক্ষা করতে পারেন।

for( id obj in arr ){
    if( [obj isContagious] ){
        break;    // Stop enumerating
    }

    if( ![obj isKindOfClass:[Perefrigia class]] ){
        continue;    // Skip this object
    }

    [obj immanetizeTheEschaton];
}

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if( [obj isContagious] ){
        *stop = YES;    // Stop enumerating
        return;
    }

    if( ![obj isKindOfClass:[Perefrigia class]] ){
        return;    // Skip this object
    }

    [obj immanentizeTheEschaton];
}];

এটি একটি আউট প্যারামিটার কারণ এটি কলিং স্কোপ থেকে কোনও ভেরিয়েবলের একটি রেফারেন্স। এটি আপনার ব্লকের ভিতরে সেট করা দরকার, তবে এর মধ্যে পড়ুন enumerateObjectsUsingBlock:, NSErrorফ্রেমওয়ার্ক কলগুলি থেকে সাধারণত একইভাবে আপনার কোডে ফিরে যায়।

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
    // N.B: This is probably not how this method is actually implemented!
    // It is just to demonstrate how the out parameter operates!

    NSUInteger idx = 0;
    for( id obj in self ){

        BOOL stop = NO;

        block(obj, idx++, &stop);

        if( stop ){
            break;
        }
    }
}

21
লক্ষ্য করুন যে stopপতাকাটি উপদেষ্টা; উদাহরণস্বরূপ, সমসাময়িক ক্ষেত্রে কিছু অপরিজ্ঞাত সংখ্যার পুনরাবৃত্তিগুলির জন্য গণনা অবিরত থাকতে পারে। উদাহরণস্বরূপ, আপনি __blockগণনার প্রতিটি পাসে নিঃশর্তভাবে একটি পরিবর্তনশীল সেট করা উচিত নয় stopএবং তাড়াতাড়ি সমাপ্তির সময় ব্যবহার করার সময় এটি "শেষ" মান হিসাবে প্রত্যাশা করে । আপনার সবসময় "না, এই অবজেক্টটি ব্যবহার করুন" সেটিংসের সাথে জুড়ি দেওয়া উচিত stop = YES;
বুবুম

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

4
<rdar: // সমস্যা / 15015199> এখন ডকুমেন্টেশন কোনওভাবেই বলে না এবং এটি হওয়া উচিত বলে স্পষ্টতা চেয়েছে।
বুবুম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.