2009-05-16 30 views
13

अरे, यहां त्वरित प्रश्न है। मुझे यकीन है कि एक साधारण जवाब है।उद्देश्य-सी डिफ़ॉल्ट तर्क मूल्य

function myFunction ($array, $sort = FALSE) { 

} 

मैं इन सबसे पैरामीटर नहीं भरा गया था, समारोह झूठी का डिफ़ॉल्ट मान के साथ जारी रहेगा:

PHP से आ रहा है, मैं इस तरह एक डिफ़ॉल्ट तर्क मूल्य के साथ एक समारोह की घोषणा करने के लिए इस्तेमाल कर रहा हूँ । Obj-C में, क्या एक समान बात है?

मैं अपने "प्रोग्रामिंग इन ऑब्जेक्टिव-सी 2.0" पुस्तक में अभ्यास के माध्यम से काम कर रहा हूं, और यह चाहता है कि मैं डिफ़ॉल्ट रूप से एक अंश वर्ग प्रिंट फ़ंक्शन को फिर से लिखूं- ly अंश को कम न करें, लेकिन यदि मान TRUE कम करने के लिए, आगे बढ़ें और अंश को कम करें, फिर प्रिंट करें। अध्याय (पुस्तक में कहीं भी नहीं) इस पर कोई जानकारी देता है।

आपकी मदद के लोगों के लिए धन्यवाद: डी

+0

डुप्लिकेट: http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c-2-0 –

उत्तर

1

नहीं, डिफ़ॉल्ट तर्क C++, C या ऑब्जेक्टिव-सी नहीं की एक विशेषता है।

function myFunction ($array, $sort) 

function myFunction ($array) 
// call myFunction($array, FALSE) 
+0

वास्तव में, नहीं, आप ऐसा नहीं कर सकते क्योंकि यह भी एक सी ++ है - आईएसएम ... –

24

डिफ़ॉल्ट तर्क ऑब्जेक्टिव-सी, दर असल में मौजूद नहीं हैं:

आप उद्देश्य-सी में करने के लिए होता है क्या निम्नलिखित (ऊपर अपने छद्म कोड का उपयोग) है। वे वास्तव में नहीं कर सकते हैं, क्योंकि तर्क गणना विधि के नाम से अनजाने में बंधी जाती है - प्रत्येक कोलन एक तर्क के अनुरूप होता है।

उद्देश्य-सी प्रोग्रामर एक समान लक्ष्य पूरा करते हैं, हालांकि, "सुविधा" विधियों को बनाकर, जो डिफ़ॉल्ट मानों से भरे कुछ तर्कों के साथ बस एक और "आदिम" विधि को कॉल करते हैं। उदाहरण के लिए, 10 के लिए NSMakeRange(0, [self count]) के तर्क के साथ -[NSArray indexOfObject:inRange:] के संस्करण के रूप में कार्यान्वित किया जा सकता है।

इस मामले में, हालांकि, मुझे नहीं लगता कि आपकी पुस्तक उस बारे में बात कर रही है। मुझे लगता है कि अगर reduce: तर्क के लिए हाँ दिया गया है तो उसे कम करने का मतलब है और यदि कोई नहीं दिया जाता है तो इसे कम नहीं किया जाता है।

9

आप जो चाहते हैं उसे प्राप्त करने के लिए दो मानक पैटर्न हैं।

(1) विधि के कई तर्क फ़ॉर्म लिखें और फिर कम तर्क सुविधा संस्करण प्रदान करें। उदाहरण के लिए, NSString पर निम्न विधियों पर विचार करें:

- (NSComparisonResult)compare:(NSString *)string; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask 
      range:(NSRange)compareRange; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask 
      range:(NSRange)compareRange locale:(id)locale; 

पहले तीन धारणात्मक हैं [और संभावना को ठोस रूप से, मैं जांच नहीं] चौथे संस्करण के लिए के माध्यम से कॉल के रूप में लागू। वह, है-कॉम्पारे: कॉल-कॉम्पैयर: विकल्प: रेंज: लोकेल: तीन अतिरिक्त तर्कों के लिए उपयुक्त डिफ़ॉल्ट मानों के साथ।

(2) अन्य पैटर्न विधि के कई तर्क संस्करण को लागू करना है और डिफ़ॉल्ट मान प्रदान करते हैं जब कोई तर्क न्यूल/शून्य होता है या कुछ मान पर सेट होता है जो डिफ़ॉल्ट को इंगित करता है। एनएसडीटा में ऐसे पैटर्न हैं जो इस पैटर्न के साथ लागू किए गए हैं। उदाहरण के लिए:

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask 
      error:(NSError **)errorPtr; 

आप readOptionsMask तर्क के लिए 0 पार कर लेते हैं, NSData एक आंतरिक परिभाषित डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर फ़ाइल की सामग्री को पढ़ा जाएगा। उस डिफ़ॉल्ट कॉन्फ़िगरेशन समय के साथ बदल सकता है।

8

यह सवाल सुपर पुराना है, लेकिन इस मामले में किसी को भी यह पाता है, PHP कोड का ऑब्जेक्टिव-सी संस्करण (इस संभालने वर्ग के अंदर स्थित है) शायद कुछ इस तरह होगा:

-(id)myFunction:(NSArray*)array { 
    return [self myFunction:array withSort:FALSE]; 
} 

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort { 
    // CODE 
} 

मैं इस्तेमाल किया (आईडी) के रूप में आपके PHP कोड में कोई डेटा प्रकार की जानकारी नहीं है। वास्तविक डेटा प्रकारों के साथ (आईडी) को प्रतिस्थापित करना बुद्धिमान होगा।

+0

बहुत बढ़िया, हालांकि काफी स्मार्ट। –

4

भयानक नेक्रो लेकिन किसी को भी यह गुगल करने के लिए, एक्सकोड 4.5 का समर्थन करता है (Clang के माध्यम से) __attribute__((overloadable)) के साथ सी कार्यों का अधिभार।

ओवरलोडेड फ़ंक्शंस को विभिन्न प्रकार के तर्क होने की अनुमति है, इसलिए यदि सी कार्य आप जो करने का प्रयास कर रहे हैं उसके लिए उपयुक्त हैं तो आप डिफ़ॉल्ट तर्क मान प्राप्त करने के लिए इसका उपयोग कर सकते हैं।

यहाँ दो कार्यों के साथ एक ज फ़ाइल की एक काल्पनिक उदाहरण है, दोनों PrintNum कहा जाता है:

// Prints a number in the decimal base 
__attribute__((overloadable)) extern void PrintNum(NSNumber *number); 

// Prints a number in the specified base 
__attribute__((overloadable)) extern void PrintNum(NSNumber *number, NSUInteger base); 

और .m फ़ाइल में:

__attribute__((overloadable)) 
void PrintNum(NSNumber *number) { 
    PrintNum(number, 10); 
} 

__attribute__((overloadable)) 
void PrintNum(NSNumber *number, NSUInteger base) { 
    // ... 
} 

ध्यान दें कि विशेषता में निर्दिष्ट किया जाना चाहिए समारोह की सभी परिभाषाओं और घोषणाओं।

+0

धन्यवाद, इस सुझाव को प्यार करो – xhan

0

आप #define का उपयोग करके आसानी से उसी प्रभाव को प्राप्त कर सकते हैं।

उदाहरण:

हेडर फाइल में आपका कार्यः

+ (NSDate *) getDateFromYear: (NSUInteger) वर्ष माह: (NSUInteger) महीने के दिन: (NSUInteger) दिन;

हेडर फाइल में एक पैरामीटर समारोह के लिए '#define' जोड़ें:

#define GetDateFromYearOnly (वर्ष) [YourClassName getDateFromYear: साल महीने: 1 दिन: 1]

फिर अपने तरह समारोह का उपयोग कर सकते : एनएसडीएटी * 2015 दिनांक = GetDateFromYearOnly (2015);

और आपको 2015/01/01 के साथ एनएसडीएटी ऑब्जेक्ट मिलेगा।

यदि फ़ंक्शन स्थिर नहीं है, तो - (NSDate *) GetDateFromYear केवल: (NSUInteger) वर्ष; और फोन: [आत्म getDateFromYear: साल महीने: 1 दिन: 1]

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