ব্লক ঘোষণা সিনট্যাক্স তালিকা


277

অবজেক্টিভ সিতে ব্লক বাক্য গঠন (এবং প্রকৃতপক্ষে সি, আমি ধারণা করি) কুখ্যাতভাবে অসম্পূর্ণ। আর্গুমেন্ট হিসাবে ব্লকগুলি পাস করা ব্লকগুলি ivars হিসাবে ঘোষণার চেয়ে পৃথক দেখায় যা আইএনএস typedefব্লকগুলির চেয়ে পৃথক দেখাচ্ছে ।

ব্লক-ডিক্লেয়ারেশন সিনট্যাক্সের একটি বিস্তৃত তালিকা আছে যা আমি দ্রুত রেফারেন্সের জন্য হাতে রাখতে পারি?


9
ব্লক প্রোগ্রামিং টপিক গাইডে "ব্লক ঘোষণা এবং তৈরি করা" এর সাথে কী সমস্যা ?
jscs

ব্লক বৈশিষ্ট্যগুলি ব্যবহারের সহজ ব্যাখ্যা: stackoverflow.com/a/20760583/294884
ফ্যাটি

উত্তর:


696

ব্লক ঘোষণার সিনট্যাক্সের তালিকা

পুরো, চলুন

  • return_typeবস্তুর / আদিম / ইত্যাদি ধরণের হতে হবে। আপনি ফিরে আসতে চান (সাধারণত void)
  • blockName আপনি যে ব্লকটি তৈরি করছেন তার পরিবর্তনশীল নাম হোন
  • var_typeটাইপ অবজেক্ট / আদিম / ইত্যাদি হোন। আপনি একটি আর্গুমেন্ট হিসাবে পাস করতে চান (কোনও পরামিতি ছাড়াই ফাঁকা ছেড়ে দিন)
  • varName প্রদত্ত প্যারামিটারের পরিবর্তনশীল নাম হতে হবে

এবং মনে রাখবেন যে আপনি নিজের পছন্দমতো প্যারামিটার তৈরি করতে পারেন।

ভেরিয়েবল হিসাবে ব্লক

সম্ভবত ঘোষণার জন্য সবচেয়ে সাধারণ।

return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
    // ...
};

সম্পত্তি হিসাবে ব্লক

ব্লকগুলি ভেরিয়েবল হিসাবে ঘোষণার মতো, তবে সাবটলি আলাদা।

@property (copy) return_type (^blockName) (var_type);

পরামিতি হিসাবে ব্লক

নোট করুন যে এটি "আর্গুমেন্ট হিসাবে ব্লকগুলি" থেকে পৃথক; এই উদাহরণস্বরূপ, আপনি এমন একটি পদ্ধতি ঘোষণা করছেন যা একটি ব্লক আর্গুমেন্ট চায়।

- (void)yourMethod:(return_type (^)(var_type))blockName;

যুক্তি হিসাবে ব্লক

নোট করুন যে এটি "পরামিতি হিসাবে ব্লকগুলি" থেকে পৃথক; এই উদাহরণস্বরূপ, আপনি এমন একটি পদ্ধতি কল করছেন যা একটি বেনামি ব্লক সহ একটি ব্লক আর্গুমেন্ট চায়। আপনি যদি ইতিমধ্যে একটি ব্লক ভেরিয়েবল ঘোষণা করে থাকেন তবে আর্গুমেন্ট হিসাবে পরিবর্তনশীল নামটি পাস করা যথেষ্ট pass

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

নামবিহীন ব্লক

এটি কার্যত একটি বেনামি ব্লক, তবে ভেরিয়েবলগুলিকে ব্লক নির্ধারণের জন্য সিনট্যাক্সটি কেবল একটি বেনাম ব্লকের সমতুল্য ভেরিয়েবল সেট করা।

^return_type (var_type varName)
{
    //...
};

typedef বাধা

এটি আপনাকে একটি ছোট নাম সেট আপ করতে দেয় যা ব্লক ঘোষণার সময় অন্যান্য শ্রেণীর নামের মতোই উল্লেখ করা যেতে পারে।

typedef return_type (^blockName)(var_type);

এরপরে blockNameস্ট্যান্ডার্ড ব্লক ডিক্লেয়ারেশন সিনট্যাক্সের পরিবর্তে কেবলমাত্র বিকল্প হিসাবে ব্যবহার করুন।

ইনলাইন ব্লক

এটি যুক্তিযুক্তভাবে ব্লকগুলির একটি কম দরকারী ব্যবহার, তবে তা সত্ত্বেও এর জায়গা থাকতে পারে। একটি ইনলাইন ব্লক হ'ল তাত্ক্ষণিকতার পরে অবিলম্বে একটি বেনামে ব্লক।

^return_type (var_type varName)
{
    //...
}(var);

ইনলাইন ব্লকগুলি স্কোপ অফসেটিংয়ের জন্য প্রাথমিকভাবে কার্যকর এবং কোডটি সাধারণ ব্রেস-ডিলিমিট অংশগুলির প্রায় সমান।

{
   //...
}

পুনরাবৃত্তি ব্লক

এটি আপনাকে নিজের থেকে একটি ব্লক কল করতে দেয়, একটি লুপ তৈরি করে যা কলব্যাক এবং জিসিডি কল চলাকালীন ব্যবহৃত হতে পারে। এই ইনস্ট্যান্টেশন পদ্ধতিটি এআরসি-তে ধরে রাখার চক্র মুক্ত।

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }

    // ...
} copy];
blockName(varValue);

রিটার্নিং ব্লক

একটি পদ্ধতি একটি ব্লক ফিরে আসতে পারে,

- (return_type(^)(var_type))methodName
{
    // ...
}

কিছু ফাংশন হিসাবে যদি, কিছু আশ্চর্যজনকভাবে পারেন।

return_type (^FunctionName())(var_type)
{
    // ...
}

Addendums

আমি যদি কিছু মিস করেছি তবে দয়া করে মন্তব্যগুলিতে আমাকে জানান, এবং আমি সেগুলি অনুসন্ধান / যুক্ত করব।

ওহ, এবং সুইফটে ...

blockName = (varName: var_type) -> (return_type)

এটি প্রায় কোনও ভাষার বৈশিষ্ট্যের মতো।


1
@ প্যাক্পেরিনী একটি দুর্দান্ত তালিকা! এবং ভেরিয়েবল ঘোষণায় (আপনার তালিকার 1 ম আইটেম) টাইপডেফ ব্লক সংজ্ঞাটি কীভাবে ব্যবহার করবেন? লজিকাল BlockType ^blockVar = Anonymous Blockসিনট্যাক্স ত্রুটিটিও ^ খুব ছাড়াই দেখায় :(
esp

14
আমার মস্তিষ্ক ব্লক ঘোষণার জন্য এই সমস্ত বিভিন্ন বাক্য গঠন মনে রাখতে অক্ষম। আমি সম্ভবত সপ্তাহে একবার এই উত্তর তাকান। আশা করি আমি এর জন্য আপনাকে 10 টি আপগেট দিতে পারতাম।
বেন ব্যারন

36
এর মতো উত্তরের জন্য আমাদের স্ট্যাকওভারফ্লো হল অফ ফেম দরকার।
বেজনবি

1
মুদ্রণের জন্য দর্শকের সাথে ব্যবহারের জন্য আমি এটি মার্কডাউনে রূপান্তর করেছি। কুশলী! gist.github.com/swizzlr/6268955
Swizzlr

20
আমার মনে হয় ট্যাটু হিসাবে আমার এটি দরকার।
আইজাক ওভারেকার

83

আমি ব্যক্তিগতভাবে এই ওয়েবসাইটটি ব্যবহার করতে পছন্দ করি ( http://fuckingblocksyntax.com )। নামটি মনে রাখার জন্য ব্লক সিনট্যাক্সের চেয়ে মনে রাখা সহজ:

http://fuckingblocksyntax.com

এবং আপনি যদি তাদের মধ্যে খারাপ কথার সাথে URL গুলি লোড করতে না পারেন তবে আপনি এই আয়নাটি ব্যবহার করতে পারেন: http://goshdarnblocksyntax.com

যৌনসঙ্গমব্লকসিন্ট্যাক্স ওয়েবসাইট


1
ওয়েবসাইটের জন্য নিখুঁত নাম ..: ডি
ভিনিথ

39

typedef:

typedef void (^block)(NSString *arg);

সঙ্গতিপূর্ণভাবে:

void (^block)(NSString *) = ^(NSString *param) {
  // do something....
};

পদ্ধতি:

- (void)method:(void (^)(NSString *param))handler

এই উত্তরটি দেখায় যে এটি সর্বোপরি জটিল নয় ... মিশ্রকরণ এবং মেলাতে মাত্র 3 টি আলাদা সিনট্যাক্স।
জোসেফ চেন

4
গৃহীত উত্তরটি অপ্রয়োজনীয় ফোটা সহ এই উত্তরটির একটি অনুলিপি।
এরিক অাইনার

16

এক্সকোড 4 স্নিপেট লাইব্রেরিতে ব্লক টাইপডেফগুলির জন্য টেম্পলেট এবং ভেরিয়েবল হিসাবে ইনলাইন ব্লক রয়েছে। এগুলি স্বতঃসমাপ্তি ( typedefblockএবং inlineblock) এর মাধ্যমেও উপলব্ধ ।

পদ্ধতিগুলিতে আর্গুমেন্ট হিসাবে ব্লকগুলির জন্য, আমি একটি ঘোষণার সুপারিশ করব typedefএবং তারপরে কেবল এটি ব্যবহার করব। এটি কোড পড়তে অনেক সহজ করে তোলে।


11

আমি একটি ক্লাসের জন্য একটি সমাপ্তি ব্লক লিখেছিলাম যা একটি ডাইসকে ঝাঁকিয়ে দেওয়ার পরে তার মানগুলি ফিরিয়ে দেবে:

  1. রিটার্ন টাইপের সাথে টাইপএফের সংজ্ঞা দিন ( .hউপরের @interfaceঘোষণা)

    typedef void (^CompleteDiceRolling)(NSInteger diceValue);
  2. @propertyব্লকের জন্য একটি সংজ্ঞা দিন ( .h)

    @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
  3. finishBlock( .h) দিয়ে একটি পদ্ধতি নির্ধারণ করুন

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
  4. পূর্ববর্তী সংজ্ঞায়িত পদ্ধতি সন্নিবেশ .mফাইল এবং কমিট finishBlockকরার @propertyআগে সংজ্ঞায়িত

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
        self.completeDiceRolling = finishBlock;
    }
  5. completionBlockএটিতে পূর্বনির্ধারিত ভেরিয়েবল টাইপ পাস করার জন্য ( completionBlockউপস্থিত রয়েছে কিনা তা ভুলে যাবেন না )

    if( self.completeDiceRolling ){
        self.completeDiceRolling(self.dieValue);
    }

7
typedef void (^OkBtnBlock)(id data);
typedef void (^CancelBtnBlock)();

@property (nonatomic, strong) OkBtnBlock okBtnBlock;
@property (nonatomic, strong) CancelBtnBlock cancelBtnBlock;

+ (void)foo:(OkBtnBlock)okBtn andCancel:(CancelBtnBlock)btnCancel;

ধাপে ধাপে পুরো প্রক্রিয়াটি বর্ণনা করা ভাল, আপনি যদি আইওএসে নতুন হন তবে ব্লকগুলি বোঝা শক্ত ...
অ্যালেক্স সিও

3

আপনার যদি এক্সকোড ৪.২ এ ফিরে কাজ করার দরকার হয় তবে আপনি একটি ব্লককে সম্পত্তি হিসাবে ঘোষিত একটি ব্লককেও সংশ্লেষ করতে পারেন ঠিক যেমন আপনার কোনও নন-ব্লক সম্পত্তি রয়েছে। ব্লক সিনট্যাক্সটি আপনাকে ছুঁড়ে ফেলতে দেবে না।

আপনার ব্লকের সম্পত্তিটি যদি এটি হয়:

@property (copy) return_type (^blockName) (var_type);

তারপরে আপনার @ সন্ন্যাসাইজ হ'ল:

@property blockName;

চিয়ার্স।


হাই, আপনি কি দয়া করে পুনরায় পরীক্ষা করতে পারেন .. আমি আপনাকে অনুসরণ করার চেষ্টা করছিলাম .. @property blockNameকাজ করছে না is আমার মনে হয় এটা হওয়া উচিত @synthesize blockName;? (একটি ব্লক সংশ্লেষনের জন্য)
jeet.chanchawat

ওফ ... অপেক্ষা করুন আপনি ইতিমধ্যে (অপ্রত্যক্ষভাবে) উল্লেখ করেছেন যে এটি
এক্সকোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.