2010-03-03 7 views
19

नोट, मैं विशेष रूप से इस तथ्य का जिक्र कर रहा हूं कि क्लास विधियों के साथ डॉट नोटेशन का उपयोग किया जा रहा है, उदाहरण के तरीकों से नहीं।क्लास विधियों के साथ उद्देश्य-सी डॉट नोटेशन?

जिज्ञासा से, मैं देखना चाहता था कि क्या होगा यदि मैंने क्लास विधि के साथ उद्देश्य-सी डॉट नोटेशन सिंटैक्स का उपयोग करने का प्रयास किया।

#import <Foundation/Foundation.h> 

static int _value = 8; 

@interface Test : NSObject 

+ (int) value; 
+ (void) setValue:(int)value; 

@end 

@implementation Test 

+ (int) value { 
    return _value; 
} 

+ (void) setValue:(int)value { 
    _value = value; 
} 

@end 

int main(int argc, char * argv[]) { 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSLog(@"Test.value: %d", Test.value); 
    NSLog(@"[Test value]: %d", [Test value]); 

    Test.value = 20; 
    NSLog(@"Test.value: %d", Test.value); 
    NSLog(@"[Test value]: %d", [Test value]); 

    [Test setValue:30]; 
    NSLog(@"Test.value: %d", Test.value); 
    NSLog(@"[Test value]: %d", [Test value]); 

    [pool release]; 

    return 0; 
} 

मैं देखना है कि इस संकलित किया गया था, अकेले क्या है के साथ निष्पादित दें हैरान था, मुझे लगता है, सही व्यवहार: मेरे प्रयोग इस प्रकार थी। क्या यह कहीं कहीं दस्तावेज है, या सिर्फ संकलक का एक झुकाव है?

मैं मैक ओएस एक्स 10.6 पर जीसीसी का उपयोग कर संकलित:

gcc --version: i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659) 

compile using: gcc ObjCClassDotSyntax.m -framework Foundation -o ObjCClassDotSyntax 
run: ./ObjCClassDotSyntax 

output: 
2010-03-03 17:33:07.342 test[33368:903] Test.value: 8 
2010-03-03 17:33:07.346 test[33368:903] [Test value]: 8 
2010-03-03 17:33:07.351 test[33368:903] Test.value: 20 
2010-03-03 17:33:07.352 test[33368:903] [Test value]: 20 
2010-03-03 17:33:07.353 test[33368:903] Test.value: 30 
2010-03-03 17:33:07.353 test[33368:903] [Test value]: 30 
+0

और, मुझे आश्चर्य है, क्यों Xcode ** स्वत: पूर्ण नहीं ** जब डॉट वाक्य रचना वर्ग तरीकों के लिए प्रयोग किया जाता है? यदि यह वास्तव में वाक्य रचनात्मक चीनी है, उदा। 'foo.prop' पूरी तरह से '[foo prop]' में अनुवाद करता है, फिर एक्सकोड क्लास विधियों और उदाहरण विधियों के बीच अंतर नहीं होना चाहिए। ईविल के लिए – Timo

उत्तर

31

यह सही व्यवहार है। foo.method[foo method] के लिए वाक्य रचनात्मक चीनी है - समान अर्थशास्त्र के साथ सीधे रूपांतरण। इसी तरह foo.prop = bar[foo setProp:bar] के लिए सिंटैक्टिक चीनी है, फिर से समान अर्थशास्त्र के साथ। यह परिवर्तन कंपाइलर में लागू किया गया है। इस प्रकार आप [foo doSomething] के बजाय foo.doSomething में 0-पैरामीटर विधियों को कॉल करने के लिए डॉट नोटेशन का उपयोग कर सकते हैं। बेशक, यदि आप ऐसा करते हैं, तो आप बुरा हैं।

तथ्य यह है कि कैली एक वर्ग उदाहरण है, उद्देश्य-सी में, कक्षाएं भी वस्तुएं हैं। कक्षा में डॉट नोटेशन का उपयोग उस वर्ग पर पैरामीटर रहित विधि को कॉल करता है।

Objective-C Programming Language दस्तावेज़ में डॉट नोटेशन का वर्णन किया गया है।

+9

+1। गंभीरता से हालांकि, मीठा सिंथेटिक चीनी का उपयोग करना बुरा होगा, और यदि हां, तो क्यों? – andy

+0

मैं विशेष रूप से इस तथ्य का जिक्र कर रहा हूं कि * कक्षा * विधियों पर डॉट नोटेशन का उपयोग नहीं किया जा रहा है, उदाहरण * विधियों * नहीं। क्या यह अभी भी व्यवहार की उम्मीद है? – Eric

+0

तथ्य यह है कि यह एक वर्ग विधि है कोई फर्क नहीं पड़ता। जैसा कि बैरी ने इंगित किया था, डॉट नोटेशन का उपयोग करना स्क्वायर ब्रेसेस का उपयोग करके विधियों को कॉल करने जैसा ही है। –

10

में "बुराई, लेकिन यह काम करता है" श्रेणी, मैं से ब्लॉक वापस लौट कर इस तरह के NSMutableArray *myArray = NSMutableArray.array

+15

मैन, यह पूरी तरह से बुरा है। मुझे नहीं पता कि बुराई के लिए ऊपर उठाना या डाउनवोट करना .... –

+0

बेशक, आप "myView.setNeedsDisplay" भी कर सकते हैं; या कोई अन्य संदेश जो कोई पैरामीटर नहीं लेता है। – NSResponder

+3

आप इतने बुरे हैं, मेरे प्रोग्रामर दिल को आपके विचारों से संक्रमित होने देते हैं। मेरा मालिक मुझे अपने घुटनों पर विनती करेगा। सभी लोग जो मेरा कोड देखेंगे और रोएंगे, 'क्योंकि मैं भी एक बुरे आदमी बनूंगा। – Binarian

0

Underscore पुस्तकालय आगे हनन इस वाक्य रचना के रूप में एक समय में एक बार डॉट नोटेशन के साथ सुविधा कंस्ट्रक्टर्स उपयोग करने के लिए जाना जाता रहा है, वर्ग के तरीकों, इस तरह कोड में जिसके परिणामस्वरूप:

+ (USArrayWrapper *(^)(NSArray *))array 
{ 
    return ^(NSArray *array) { 
     return [USArrayWrapper wrap:array]; 
    }; 
} 
0123:

NSArray *elements = Underscore.array(array) 
    .flatten 
    .uniq 
    .unwrap; 

यह कैसे काम करता समझने के लिए, Underscore.array की परिभाषा को देखो

तो:

Underscore.array(array) 

... इस के बराबर है:

NSArray *array = @[]; 
USArrayWrapper * (^arr)(NSArray *) = [Underscore array]; 
USArrayWrapper *result = arr(array); 
संबंधित मुद्दे