2012-07-04 16 views
5

मुझे नहीं पता कि यह सवाल कैसे ठीक है। मैं stringWithFormat: या predicateWithFormat: जैसी विधि बनाना चाहता हूं, यानी मेरी विधि प्रारूप विनिर्देशकों के साथ स्ट्रिंग के रूप में सीधे तर्क स्वीकार करती है। इसे कैसे प्राप्त किया जा सकता है?एक विधि कैसे बनाएं जो प्रारूप के साथ स्ट्रिंग को सीधे तर्क के रूप में स्वीकार करे?

जैसे,

-(void) someMethod: (NSString *)str, format; 

तो यह है कि मैं बाद में फोन कर सकते हैं इसे पसंद:

[someObject someMethod:@"String with format %@",anotherString]; 

यह किसी विशेष संदर्भ के संबंध में नहीं है।

मैं इसी तरह की एक कोड के साथ काम कर रहा था predicateWithFormat:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like myName"]; 

यह काम नहीं किया है, लेकिन:

NSString *str = @"myName"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",str]; 

तो यह:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'myName'"]; 

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

उत्तर

4

आप पैरामीटर की चर संख्या के साथ विधियों की तलाश में हैं। इस तरह के तरीके घोषित किए जाने की आवश्यकता है:

-(void) someMethod: (NSString *)str, ...; // Yes, three dots 

विधि के अंदर आप पैरामीटर को एक-एक करके निकालने के लिए मैक्रोज़ का उपयोग करते हैं। पहले पैरामीटर को यह बताने के लिए पर्याप्त जानकारी प्रदान करने की आवश्यकता है कि कितने अन्य पैरामीटर पारित किए गए हैं। उदाहरण के लिए, stringWithFormat बता सकता है कि अनचाहे % स्वरूप विनिर्देशों की गणना करके कितने पैरामीटर पारित किए जाते हैं।

- (void) someMethod:NSString *)str, ... { 
    va_list args; 
    va_start(args, str); 
    int some_count = /* figure out how many args there are */; 
    for(int i = 0; i < some_count; i++) { 
     value = va_arg(args, <some_type>); // You need to derive the type from the format as well 
    } 
    va_end(args); 
} 
10

varargs मैक्रो va_start, va_end, आदि का उपयोग करें:

-(void) someMethod: (NSString *)fmt, ... 
{ 
    va_list va; 
    va_start(va, fmt);  
    NSString *string = [[NSString alloc] initWithFormat:fmt 
               arguments:va]; 
    va_end(va); 

    // Do thing with string 
} 

यह ध्यान रखना होगा कि vararg मापदंडों उनके प्रकार खोना तो printf() और [NSString stringWithFormat] जैसे कार्यों प्रारूप स्ट्रिंग का उपयोग यह निर्धारित कितने तर्क वहाँ मदद करने के लिए है हैं और कैसे प्रत्येक का व्याख्या किया जाना चाहिए। यदि आपको एक अलग अर्थपूर्ण की आवश्यकता है तो आपको यह जानकारी कुछ कैसे प्रदान करने की आवश्यकता होगी।

+0

क्या आप कृपया varargs मैक्रोज़ पर व्याख्या कर सकते हैं। मैं उद्देश्य के लिए बहुत नया हूँ-सी। – Rakesh

+0

@ राकेश वरर्ग उद्देश्य-सी नहीं हैं, वे सी हैं। इस पृष्ठ को देखें: http://www.eskimo.com/~scs/cclass/int/sx11b.html – trojanfoe

+0

बहुत बहुत धन्यवाद! समझ गया। – Rakesh