গণনাযোগ্য অবজেক্টস ইউজিংব্লকের জন্য 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.