ब्लॉक घोषणा सिंटेक्स सूची


277

ऑब्जेक्टिव सी (और वास्तव में सी, आई प्रॉमिस) में ब्लॉक सिंटैक्स कुख्यात है। तर्क के रूप में पासिंग ब्लॉक, ब्लॉक को आइवर घोषित करने से अलग दिखता है, जो typedefआईएनजी ब्लॉक से अलग दिखता है ।

क्या ब्लॉक-डिक्लेरेशन सिंटैक्स की एक व्यापक सूची है जिसे मैं त्वरित संदर्भ के लिए हाथ में रख सकता हूं?


9
ब्लॉक प्रोग्रामिंग विषय गाइड में "घोषणा और ब्लॉक बनाने" में क्या गलत है ?
jscs

ब्लॉक गुण का उपयोग करने का सीधा स्पष्टीकरण: stackoverflow.com/a/20760583/294884
fattie

जवाबों:


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;

तर्क के रूप में ब्लॉक

ध्यान दें कि यह "पैरामीटर के रूप में ब्लॉक" से अलग है; इस उदाहरण में, आप एक ऐसी विधि कह रहे हैं जो अनाम ब्लॉक के साथ ब्लॉक तर्क चाहती है। यदि आपने पहले से ही एक ब्लॉक चर घोषित किया है, तो तर्क के रूप में चर नाम को पास करना पर्याप्त है।

[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)
{
    // ...
}

परिशिष्टों

अगर मैंने कुछ भी याद किया है, तो कृपया मुझे टिप्पणियों में बताएं, और मैं उन्हें जोड़ / शोध करूंगा।

ओह, और स्विफ्ट में ...

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

यह लगभग वैसा ही है जैसे यह एक भाषा सुविधा है।


1
@ pcperini एक महान सूची! और वेरिएबल डिक्लेरेशन में टाइपडिफैड ब्लॉक परिभाषा का उपयोग कैसे करें (आपकी सूची में पहला आइटम)? तार्किक BlockType ^blockVar = Anonymous Blockशो सिंटैक्स त्रुटि, बिना ^ भी :(
esp

14
किसी तरह मेरा दिमाग ब्लॉक घोषणाओं के लिए इन सभी विभिन्न वाक्यविन्यास को याद करने में असमर्थ है। मैं शायद सप्ताह में एक बार इस जवाब को देखता हूं। काश मैं तुम्हें इसके लिए 10 upvotes दे पाता।
बेन बैरन

36
हमें इस तरह के उत्तर के लिए स्टैकऑवरफ्लो हॉल ऑफ फेम की आवश्यकता है।
bejonbee

1
मैंने इसे मुद्रण के लिए एक दर्शक के साथ उपयोग के लिए मार्कडाउन में बदल दिया है। हैंडी! gist.github.com/swizzlr/6268955
Swizzlr

20
मुझे लगता है कि मुझे एक टैटू के रूप में इसकी आवश्यकता है।
आइजैक ओवरकेर

83

मुझे व्यक्तिगत रूप से इस वेबसाइट ( http://fuckingblocksyntax.com ) का उपयोग करना पसंद है । नाम को ब्लॉक सिंटैक्स से याद रखना आसान है:

http://fuckingblocksyntax.com

और यदि आप उनमें खराब शब्दों वाले URL लोड नहीं कर सकते हैं तो आप इस दर्पण का उपयोग कर सकते हैं: http://goshdarnblocksyntax.com

फक्किंगब्लॉकइनटैक्स वेबसाइट


1
वेबसाइट के लिए सही नाम ..: D
Vineeth

39

typedef:

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

पंक्ति में:

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

तरीका:

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

यह उत्तर दिखाता है कि यह सब के बाद जटिल नहीं है ... मिश्रण करने और मिलान करने के लिए सिर्फ 3 अलग-अलग वाक्यविन्यास।
जोसेफ चेन

4
स्वीकृत उत्तर अनावश्यक ब्लोट के साथ इस उत्तर की एक प्रति है।
एरिक एगर

16

Xcode 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;

कदम से कदम पूरी प्रक्रिया का वर्णन करने के लिए अच्छा होगा, अगर आप ios के लिए नए हैं तो ब्लॉक को समझना मुश्किल है ...
एलेक्स Cio

3

यदि आपको Xcode 4.2 में वापस काम करने की आवश्यकता है, तो आप एक संपत्ति के रूप में घोषित ब्लॉक को @synthesize भी कर सकते हैं जैसे आप एक गैर ब्लॉक संपत्ति के साथ करेंगे। ब्लॉक सिंटैक्स आपको फेंकने न दें।

यदि आपकी ब्लॉक प्रॉपर्टी यह है:

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

तो फिर आपका @साइनेटाइज यह है:

@property blockName;

चीयर्स।


हाय, क्या आप कृपया पुनः जाँच कर सकते हैं .. मैं सिर्फ आपका अनुसरण करने की कोशिश कर रहा था .. @property blockNameकाम नहीं कर रहा है। मुझे लगता है कि यह होना चाहिए @synthesize blockName;? (एक ब्लॉक को संश्लेषित करने के लिए)
jeet.chanchawat

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