2009-06-03 10 views

उत्तर

27

ओएस एक्स 10.6 ब्लॉक पेश किए। AlBlue's answer for examples देखें।

यदि आप हिम तेंदुए का उपयोग नहीं कर रहे हैं, तो आप विभिन्न अन्य सुविधाओं का उपयोग करके फ़ंक्शन संरचना के करीब कुछ प्राप्त कर सकते हैं।

उदाहरण सी का उपयोग कर समारोह संकेत:

void sayHello() { 
    NSLog(@"Hello!"); 
} 

void doSomethingTwice(void (*something)(void)) { 
    something(); 
    something(); 
} 

int main(void) { 
    doSomethingTwice(sayHello); 
    return 0; 
} 

उदाहरण आदेश पद्धति का उपयोग कर:

@interface SaySomething : NSObject { 
} 
- (void) sayHello; 
@end 

@implementation SaySomething 
- (void) sayHello { 
    NSLog(@"Hello!");  
} 
@end 

void doSomethingTwice(id<NSObject> obj, SEL selector) { 
    [obj performSelector:selector]; 
    [obj performSelector:selector]; 
} 

int main(void) { 
    SaySomething* saySomething = [[SaySomething alloc] init]; 
    doSomethingTwice(saySomething, @selector(sayHello)); 
    [saySomething release]; 
    return 0; 
} 
+1

यह पहले सच हो सकता है, लेकिन भाषा में अब ब्लॉक हैं, जो आपको वास्तविक लैम्ब्डा अभिव्यक्तियों को परिभाषित करने की अनुमति देता है। ऐसा कहा जाता है कि, उपरोक्त वर्णित @selector() s को पास करने में सक्षम होने के उद्देश्य उद्देश्य-टूल टूलकिट में वास्तव में उपयोगी तंत्र है। ओएस एक्स – AlBlue

+1

-1, ब्लॉकों के बारे में जानकारी खोने के लिए, कुछ में ब्लॉक पर बेहतर हो सकता है जो डिजाइन पैटर्न प्रदान करने के लिए +1 स्थितियों। विस्तृत उत्तर के लिए – harms

+0

+1 के नए 10.6 संस्करण में ऐप्पल के जीसीसी का उपयोग करते समय ब्लॉकों के बारे में जानकारी खोने के लिए – user2398029

3

मैं NSConference के बारे में बात पर आंद्रे पेंग सुना:

@protocol Command <NSObject> 
- (void) doSomething; 
@end 

@interface SayHello : NSObject <Command> { 
} 
@end 

@implementation SayHello 
- (void) doSomething { 
    NSLog(@"Hello!");  
} 
@end 

void doSomethingTwice(id<Command> command) { 
    [command doSomething]; 
    [command doSomething]; 
} 

int main(void) { 
    SayHello* sayHello = [[SayHello alloc] init]; 
    doSomethingTwice(sayHello); 
    [sayHello release]; 
    return 0; 
} 

उदाहरण एक चयनकर्ता का उपयोग उद्देश्य-सी के अगले संस्करण के साथ कैसे ब्लॉक पेश किए जा रहे थे।

यह कार्यात्मक प्रोग्रामिंग की अनुमति देनी चाहिए।

संपादित करें: चूंकि हिम तेंदुए को जारी किया गया है, यह वास्तव में मामला है। उद्देश्य-सी में अब Blocks है।

87

उद्देश्य-सी में लैम्ब्डा की अवधारणा अब Blocks के विचार के साथ encapsulated है जो पास-दर-संदर्भ कार्यों के बराबर हैं। बेशक, तर्कसंगत रूप से एक व्यक्ति पहले से ही सी में फंक्शन पॉइंटर्स के विचार के साथ था; ब्लॉक स्थानीय राज्य को कैप्चर करने का एक तरीका है (यानी बंद हो सकता है)। वास्तव में, ब्लॉक को अन्य सी भाषाओं में भी इस्तेमाल किया जा सकता है (मैक पर) - उन्हें मानक सी सिंटैक्स का हिस्सा बनाने का एक प्रस्ताव है।

यहाँ एक लैम्ब्डा परिभाषित करने दो नंबर एक साथ गुणा करने का एक उदाहरण है:

int (^mult)(int, int) = ^(int a, int b) { return a*b; }; 

पहले भाग में एक चर वाणी, प्रकार ^int(int,int) की और फिर लैम्ब्डा अभिव्यक्ति (उर्फ ब्लॉक) जो कई रिटर्न के लिए इसे प्रदान करती है इसके दो तर्कों का। फिर आप उस एफएन को पास कर सकते हैं, इसे अन्य स्थानों आदि में परिभाषित कर सकते हैं; आप इसे अन्य कार्यों में भी उपयोग कर सकते हैं।

multiplyBy = ^(int a) { return ^(int b) { return b*a; }; }; 
triple = multiplyBy(3); 

ध्यान दें कि आप वस्तु प्रकार (आमतौर पर ऑब्जेक्ट प्रकार के रूप में id का प्रयोग करके) के साथ ब्लॉक मिश्रित कर सकते हैं और नए के कई:

यहाँ एक समारोह है, जो जब लागू परिभाषित करने का एक उदाहरण है, एक और फ़ंक्शन उद्देश्य-सी ऑब्जेक्ट डेटा संरचनाओं में कुछ प्रकार के ब्लॉक-स्तरीय ऑपरेशन होते हैं। जीसीडी मनमाने ढंग से घटनाओं को पारित करने के लिए ब्लॉक का भी उपयोग करता है; हालांकि, ध्यान दें कि जीसीडी का भी फ़ंक्शन पॉइंटर्स के साथ उपयोग किया जा सकता है।

+0

+1। – Abizern

+0

ध्यान दें कि ब्लॉक समर्थन को 10.5 तक और आईओएस ओएस को प्लेज़िबल ब्लॉक्स प्रोजेक्ट के साथ पोर्ट किया गया है। http://code.google.com/p/plblocks/ – Chuck

+1

ध्यान दें कि ब्लॉक ब्लॉकों प्रोजेक्ट के बिना आईओएस 4 में ब्लॉक्स का उपयोग किया जा सकता है। –

संबंधित मुद्दे