2010-03-06 7 views
37

मैंने गुगल किया है और यह पता चला है कि परिवर्तनीय तर्कों का उपयोग कैसे करें। लेकिन मैं अपने चर तर्कों को किसी अन्य विधि में पास करना चाहता हूं। मुझे त्रुटियां मिल रही हैं। उसको कैसे करे ?वैरिएबल तर्कों को किसी अन्य विधि में कैसे पास किया जाए?

-(void) aMethod:(NSString *) a, ... { 
    [self anotherMethod:a]; 
    // i m doing this but getting error. how to pass complete vararg to anotherMethod 
} 

उत्तर

49

AFAIK ObjectiveC (सिर्फ C और C++) की तरह एक वाक्य रचना आपके द्वारा सीधे तौर मन में है की अनुमति देता है कि आप के साथ प्रदान नहीं करते।

सामान्य कार्यवाही एक समारोह के दो संस्करणों को बनाना है। एक जिसे सीधे उपयोग किया जा सकता है ... और दूसरों द्वारा बुलाया जाने वाला दूसरा पैरामीटर को va_list के रूप में पास करने में काम करता है।

 
.. 
[obj aMethod:@"test this %d parameter", 1337); 
[obj anotherMethod:@"test that %d parameter", 666); 
.. 

-(void) aMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a withParameters:(va_list)valist 
{ 
    NSLog([[[NSString alloc] initWithFormat:a arguments:valist] autorelease]); 
} 
+1

-otherotherMethod में एक मेमोरी दुबला है: पैरामीटर: आपको [[NSString alloc] init] –

+0

पर एक ऑटोरेलीज़ जोड़ने की आवश्यकता है और सही @ बिल – Till

+0

उत्कृष्ट! मैं predictWithFormat को भविष्य में एक परिवर्तनीय तर्क सूची उत्तीर्ण करना चाहता था: और यह सुझाव देने के बाद, मुझे एहसास हुआ कि ऐप्पल ने वास्तव में एक predicateWithFormat प्रदान किया है: तर्क: समकक्ष जो मैंने पहले नहीं देखा था। – ArtOfWarfare

20

आप variadic तर्क सीधे पारित नहीं कर सकते हैं। लेकिन इनमें से कुछ विधियां एक विकल्प प्रदान करती हैं कि आप va_list तर्क उदा।

#include <stdarg.h> 

-(void)printFormat:(NSString*)format, ... { 
    // Won't work: 
    // NSString* str = [NSString stringWithFormat:format]; 

    va_list vl; 
    va_start(vl, format); 
    NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease]; 
    va_end(vl); 

    printf("%s", [str UTF8String]); 
} 
1

क्या आपने किसी भी सरणी या शब्दकोश में अपने तर्क स्थापित करने और सशर्त कोडिंग करने पर विचार किया है?

-(void) aMethodWithArguments:(NSArray *)arguments { 
    for (id *object in arguments) { 
     if ([object isKindOfClass:fooClass]) { 
      //handler for objects that are foo 
      [self anotherMethod:object]; 
     } 
     if ([object isKindOfClass:barClass]) { 
      //and so on... 
      [self yetAnotherMethod:object]; 
     } 
    } 
} 
0

मुझे लगता है कि आप एक ही चीज़ को प्राप्त करने के लिए मैक्रोज़ का उपयोग कर सकते हैं।

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__] 

यह मेरा समाधान है: मान लीजिए कि आप एक और

-(void) aMethod:(NSString *) a, ... { 
} 

को aMethod के चर तर्क पारित आप अपने एक और 'विधि' मैक्रो का उपयोग हालांकि यह एक वास्तविक तरीका नहीं है निर्धारित कर सकते हैं करना चाहते हैं करते हैं।

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

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