Xcode 4.4 जारी नोटों में वर्णित "ऑब्जेक्टिव-सी लिटरल्स" के विवरण क्या हैं?


188

मैं Xcode 4.4 के लिए रिलीज़ नोट्स से गुजर रहा था और इस पर ध्यान दिया:

एलएलवीएम 4.0 कंपाइलर

Xcode में अब निम्नलिखित नएObjective-C भाषा विशेषताओं सहित Apple LLVM कम्पाइलर संस्करण 4.0 शामिल है: [...]
- ऑब्जेक्टिव-सी शाब्दिक: NSArray, NSDictionary, और NSNumber के लिए शाब्दिक रूप से बनाएं, NSString के लिए शाब्दिक रूप में ही।

मैं इस सुविधा के बारे में चिंतित हूँ। यह पूरी तरह से मेरे लिए के लिए कितना शाब्दिक स्पष्ट नहीं NSStringकाम और कैसे एक उन पर इस्तेमाल कर सकते हैं NSArray, NSDictionaryऔर NSNumber

विवरण क्या हैं?


उत्तर नहीं, लेकिन यहां कुछ अटकलें हैं: reddit.com/r/programming/comments/pso6x/xcode_43_released/…
Arjan Tijms

3
"क्या यह सामग्री एनडीए के अधीन नहीं है?" और आपकी समस्या है?
हज्जाजमन

7
नहीं, Apple ने स्पष्ट रूप से कहा है कि ये जोड़ियाँ मेलिंग सूची में NDA नहीं हैं।
ग्रिटस्पेक

2
LLVM के इस पर कुछ दस्तावेज़ हैं: clang.llvm.org/docs/LanguageExtensions.html#objc_lambdas
स्टीवन क्रैमर

3
यहाँ उद्देश्य-सी शाब्दिकों
थॉमसडब्ल्यू

जवाबों:


393

Http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdEDIA-nsarray-and से कॉपी की गई शब्दश :

उद्देश्य-सी शाब्दिक: एक अब NSArray, NSDictionary और NSNumber के लिए शाब्दिक बना सकता है (जैसे कोई NSString के लिए शाब्दिक बना सकता है)

NSArray लिटरल

पहले:

array = [NSArray arrayWithObjects:a, b, c, nil];

अभी:

array = @[ a, b, c ];

एनडीडब्लू साहित्य

पहले:

dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
                                   forKeys:@[k1, k2, k3]];

अभी:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

NSNumber लिटरल

पहले:

NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];

अभी:

NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;

[संपादित करें]

zxoq पर http://news.ycombinator.com/item?id=3672744 ने और अधिक दिलचस्प नई सबस्क्रिप्टिंग जोड़ी है। (शाब्दिक अर्थों के साथ जोड़ा गया):

arr[1]      === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]

[संपादित करें 2]

नए डब्ल्यूडब्ल्यूडीसी 2012 सत्रों में नए ओजेसी शाब्दिक पर चर्चा की गई । मैंने जानबूझकर फ़ाइल नाम और प्रत्येक स्लाइड के समय को नहीं हटाया था ताकि आप अपने आप को उनके लिए पा सकें यदि आपको ऐसा लगता है। वे अनिवार्य रूप से इस पोस्ट में बताए गए समान हैं, लेकिन कुछ नई चीजें भी हैं जिनका मैं छवियों के ऊपर उल्लेख करूंगा।

कृपया ध्यान दें कि चित्र सभी बड़े हैं। बस उन्हें उनके मूल आकार में देखने के लिए दूसरे टैब में खींचें

साहित्य और मुक्केबाजी

[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]

साहित्य और मुक्केबाजी

@42
@10.8
@YES
@(6 + x * 2012)

संग्रह की सदस्यता

[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]

संग्रह की सदस्यता

@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]

@ # नंबर, @ {} शब्दकोशों, @ "" तार, @ [] सरणियों, @ () के भाव


यह हिस्सा नया है। अभिव्यक्ति साहित्य

जब आपके पास एक अभिव्यक्ति है ( M_PI / 16उदाहरण के लिए) तो आपको इसे कोष्ठक के अंदर रखना चाहिए।

यह सिंटैक्स, अंक (C-) स्ट्रिंग, बूलियन मान, एनम कॉन्स्टेंट, और यहां तक ​​कि वर्ण स्ट्रिंग में एक इंडेक्स खोजने के लिए अंक भाव, बूलियन के लिए काम करता है!

अभिव्यक्ति साहित्य

NSNumber *piOverSixteen = [NSNumber numberWithDouble: (M_PI / 16)];

NSNumber *hexDigit = [NSNumber numberWithChar:"0123456789ABCDEF"[i % 16]];

NSNumber *usesScreenFonts = [NSNumber numberWithBool:[NSLayoutManager usesScreenFonts]];

NSNumber *writingDirection = [NSNumber numberWithInt:NSWritingDirectionLeftToRight];

NSNumber *path = [NSString stringWithUTF8String: getenv("PATH")];

अभिव्यक्ति साहित्य

NSNumber *piOverSixteen = @( M_PI / 16 );

NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] );

NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

NSNumber *path = @( getenv("PATH") );

चरित्र के तार के बारे में और आप इस शाब्दिक वाक्य रचना का उपयोग कब और कैसे कर सकते हैं:

बॉक्सिंग स्ट्रिंग एक्सप्रेशंस

NSString *path = [NSString stringWithUTF8String: getenv("PATH")];
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

बॉक्सिंग स्ट्रिंग एक्सप्रेशंस

NSString *path = @( getenv("PATH") );
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

कैसे सरणी शाब्दिक काम करते हैं

कैसे सरणी शाब्दिक काम करते हैं

// when you write this:
array = @[a, b, c ];

// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects) / sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

कैसे शब्दकोश शाब्दिक काम करते हैं

कैसे शब्दकोश शाब्दिक काम करते हैं

// when you write this:
dict = @{k1 : o1, k2 : o2, k3 : o3 };

// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects
                                   forKeys:keys
                                     count:count];

सरणी सबस्क्रिप्टिंग पर अधिक

सदस्यता प्राप्त करना

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = [_songs objectAtIndex:idx];
    [_songs replaceObjectAtindex:idx withObject:newSong];
    return oldSong;
}

सदस्यता प्राप्त करना

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = _songs[idx];
    _songs[idx] = newSong;
    return oldSong;
}    

शब्दकोश सबस्क्रिप्टिंग पर अधिक

शब्दकोश सदस्यता

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = [_storage objectForKey:key];
    [_storage setObject:object forKey:key];
    return oldObject;
}

शब्दकोश सदस्यता

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = _storage[key];
    _storage[key] = newObject;
    return oldObject;
}

[संपादित करें ३]

माइक ऐश ने इन नए साहित्यकारों के बारे में एक शानदार लिखा है यदि आप इस सामान के बारे में अधिक जानना चाहते हैं, तो इसे देखना सुनिश्चित करें ।



9
मैं अपने कोडिंग को तेज कर सकता हूं!
पेड्रो मैन्चेनो

12
क्या इन नए नोटेशनों का समर्थन करने के लिए xCode 4.3 प्राप्त करने का कोई तरीका है? मैं उन्हें चाहते हैं - अब ... लेकिन हूँ अतः नहीं उनके लिए ... "माउंटेन ऊपर जा रहा"
एलेक्स ग्रे

20
आपके पास यहां छवियों में बहुत सी पाठ्य सामग्री है जो किसी खोज इंजन द्वारा अधिक खोज योग्य होगी यदि इसे सादे पाठ के रूप में पोस्ट किया गया हो।
छिपकली

5
@BilltheLizard मैं सम्मानपूर्वक असहमत हूं। अधिकांश परीक्षण या तो संयुक्त राष्ट्र की खोज योग्य चीजें हैं {और [, या जैसे सामान्य शब्द हैं array, idऔर @implementation। प्रासंगिक कीवर्ड हैं literal, objcऔर xcode, [या के विशिष्ट उल्लेख नहीं हैं @implementation। आप Google पर सामान्य ओब्जेक प्रश्नों के लिए यह प्रश्न नहीं दिखाना चाहते हैं, यह केवल तब प्रदर्शित किया जाना चाहिए जब कोई प्रश्न objc literal, जो वर्तमान में होता है (शीर्षक और टैग के लिए धन्यवाद)।
पूर्णिया आजिमी

4
अब इसे स्टैकऑवरफ्लो उत्तर कहा जाता है। अच्छी नौकरी पूर्णिया।
नितीश

15

ऑब्जेक्टिव-सी कंपाइलर ने NSConstantStringक्लास, उर्फ ​​क्लास के इंस्टेंस के मेमोरी लेआउट के नॉलेज को हार्डकोड किया है __CFConstantString। क्लैंग सोर्स कोड में RewriteObjCStringLiteralफ़ंक्शन देखें lib/Rewrite/RewriteModernObjC.cpp। कंपाइलर केवल उन डेटा का उत्सर्जन करता है जो NSConstantStringकक्षा के उदाहरणों के लेआउट से मेल खाता है ।

शाब्दिक NSArrayऔर NSDictionaryउदाहरणों के लिए कुछ संभावनाएं हैं । वे कुछ ऐसा कर सकते थे जैसे उन्होंने शाब्दिक तार के लिए क्या किया था - कंपाइलर में उदाहरण लेआउट (एक विशेष उपवर्ग के लिए) को हार्डकोड करें और उस लेआउट में डेटा का उत्सर्जन करें। या उनके पास संकलक उत्सर्जन कोड हो सकता है जो बस रनटाइम पर एक उदाहरण बनाता है।


2
के लिए वस्तु शाब्दिक वाक्यविन्यास का कार्यान्वयन NSArrayऔर NSDictionaryइसके विपरीत काफी है NSString। संकलक बस NSDictionaryया NSArrayरनटाइम पर एक कॉल उत्पन्न करता है। यही कारण है कि वैश्विक सिंटैक्स को इस सिंटैक्स (विपरीत NSString) का उपयोग करके प्रारंभ नहीं किया जा सकता है । यह परिणाम संकलन समय स्थिर होने की आवश्यकता होगी।
बज्मी

1

से "ऑब्जेक्टिव-सी Literals"

1) NSNumber, NSDictionaryऔर Xcode 4.4NSArray में शाब्दिक उपलब्ध हैं ।

2) NSDictionaryऔर NSArrayसबस्क्रिप्टिंग की जरूरत है " Xcode 4.4 और OS X 10.8 या बाद में SDK " या " Xcode 4.5 और iOS 6 या बाद में SDK "

मुझे ऐसा लगता है जैसे सबस्क्रिप्टिंग को रनटाइम समर्थन की आवश्यकता है और इसलिए iOS6 से पहले काम नहीं करेगा ।


उसी लेख में यह "आईओएस तैनाती" कॉलम में "आईओएस 4 पर वापस आता है" कहता है
कोड 007 कोड

1
मैंने एक प्रोजेक्ट में गलती से सरणी शाब्दिक का उपयोग किया था जिसे मैंने Xcode 4.5 के साथ संकलित किया था। यह iOS5 पर चलने वाले iPad पर ठीक चलता है। यह Xcode 4.2 पर संकलित नहीं है, जो कि मुझे पता चला कि मैंने इसे किया था।
जेस्कार्री

सदस्यता लेने के लिए Xcode 4.4 और iOS5 SDK के साथ काम किया जा सकता है यदि आप एक हेडर जोड़ते हैं: github.com/tewha/iOS-Subscripting/blob/master/…
स्टीवन फिशर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.