2011-03-10 15 views
7

की सरणी लेता हीउद्देश्य सी विधि है जो तर्क

लागू किसी को भी पता है उद्देश्य सी में एक विधि है कि इस तरह के रूप में पैरामीटर के रूप में तर्क की एक सरणी ले जाएगा लागू करने के लिए कैसे:

[NSArray arrayWithObjects:@"A",@"B",nil]; 

विधि घोषणा इस विधि के लिए है:

+ (id)arrayWithObjects:(id)firstObj... 

मुझे ऐसा तरीका नहीं लगता है।

+ (void) doSometing:(id)string manyTimes:(NSInteger)numberOfTimes; 

[SomeClass doSometing:@"A",@"B",nil manyTimes:2]; 

यह warningtoo कार्य करने के लिए कई तर्क दे देंगे ': manyTimes: doSometing:'

धन्यवाद पहले से ही मैं निम्नलिखित किया था।

उत्तर

12

दीर्घवृत्त (...) सी से विरासत में मिली है; आप इसे केवल कॉल में अंतिम तर्क के रूप में उपयोग कर सकते हैं (और आपने अपने उदाहरण में प्रासंगिक कॉमा को याद किया है)। आपके मामले में तो आप शायद चाहते हैं:

+ (void)doSomethingToObjects:(id)firstObject, ...; 

या, अगर आप गिनती स्पष्ट होना चाहता हूँ और यह अच्छी तरह phrasing का एक तरीका के बारे में सोच सकते हैं:

+ (void)doManyTimes:(NSInteger)numberOfTimes somethingToObjects:(id)firstObject, ...; 

फिर आप उपयोग कर सकते हैं एलिप्स से निपटने के लिए सामान्य सी विधियां, जो stdarg.h में रहते हैं। वहाँ उन here की एक त्वरित प्रलेखन है, उदाहरण के उपयोग होगा:

+ (void)doSomethingToObjects:(id)firstObject, ... 
{ 
    id object; 
    va_list argumentList; 

    va_start(argumentList, firstObject); 
    object = firstObject; 

    while(1) 
    { 
     if(!object) break; // we're using 'nil' as a list terminator 

     [self doSomethingToObject:object]; 
     object = va_arg(argumentList, id); 
    } 

    va_end(argumentList); 
} 

संपादित करें: अतिरिक्त, टिप्पणी के जवाब में। आप किसी अन्य फ़ंक्शन में इलिप्सिस में आपको सौंपी गई विभिन्न चीज़ों को पार नहीं कर सकते हैं, जो सी को हैंडल फ़ंक्शन कॉलिंग (जिसे उद्देश्य-सी द्वारा विरासत में मिला है) के कारण इलिप्सिस लेता है, हालांकि स्पष्ट रूप से ऐसा नहीं है)। इसके बजाय आप va_list पास करते हैं। जैसे

+ (NSString *)doThis:(SEL)selector makeStringOfThat:(NSString *)format, ... 
{ 
    // do this 
    [self performSelector:selector]; 

    // make string of that... 

    // get the argument list 
    va_list argumentList; 
    va_start(argumentList, format); 

    // pass it verbatim to a suitable method provided by NSString 
    NSString *string = [[NSString alloc] initWithFormat:format arguments:argumentList]; 

    // clean up 
    va_end(argumentList); 

    // and return, as per the synthetic example 
    return [string autorelease]; 
} 
+0

क्या इलिप्सिस को पैरामीटर के रूप में लेने का कोई तरीका है और फिर पास दूसरी विधि पर है? –

+1

@ मैट्स: आप आमतौर पर va_list प्राप्त करते हैं और उस पर पास करते हैं (इसलिए, उदाहरण के लिए vprintf, या NSString -initWithFormat: तर्क :)। आप इलिप्सिस द्वारा वर्णित जो कुछ भी वर्णित नहीं कर सकते हैं (जैसा कि, एक इलिप्सिस फ़ंक्शन किसी अन्य को कॉल करता है) क्योंकि सी रनटाइम को यह जानने की आवश्यकता नहीं है कि वहां कितनी चीजें हैं और इसलिए इसे कॉपी नहीं किया जा सकता है। – Tommy

+0

क्या आप एक दूसरे उद्देश्य-सी विधि में इलिप्सिस पास करने के साथ एक कोड उदाहरण दे सकते हैं? –

3

एकाधिक तर्क (एक आर्किगिस्ट के रूप में भी जाना जाता है) केवल एक विधि घोषणा के अंत में आ सकता है। आपका doSomething विधि कुछ इस तरह दिखेगा:

+ (void)doNumberOfTimes:(NSInteger)numberOfTimes withStrings:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 

    NSString * argString = firstArg; 
    while (argString != nil) 
    { 
     // do something with argString here 

     argString = va_arg(args, NSString *); 
    } 

    va_end(args); 
} 

कहा जा करने के लिए इस प्रकार है:

[SomeClass doNumberOfTimes:2 withStrings:@"A", @"B", nil]; 

यह भी देखें: How to create variable argument methods in Objective-C

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