48

मुझे पता है कि मैं @[@"foo", @"bar"] या @{@0 : @"foo", @1 : @"bar"} के साथ NSDictionary बना सकता हूं।क्या उत्परिवर्तनीय संग्रह के लिए एक शाब्दिक वाक्यविन्यास है?

क्या NSMutableArray या NSMutableDictionary बनाने के लिए कोई शाब्दिक वाक्यविन्यास है?

+0

बस यह न भूलें कि इसकी 'NSDictionary * dictionary = @ {@ "key": @ "value"};', जिस तरह से आपने लिखा है उसके साथ भ्रमित हो सकता है। 'ऑब्जेक्ट्स विथकेस' से अलग। –

उत्तर

17

नहीं। बस NSMutableString बनाने के लिए कोई वाक्यविन्यास नहीं है। परिवर्तनीय वस्तुएं विशेष रूप से शाब्दिक मूल्यों के अनुकूल नहीं हैं।

+16

उस अंतिम वाक्य से असहमत होना है। पायथन में प्रोग्रामिंग, उदाहरण के लिए, संग्रह डिफ़ॉल्ट रूप से और डिफ़ॉल्ट रूप से परिवर्तनीय बनाए जाते हैं। यह बहुत आसान हो सकता है। –

+0

@ जोश कैसवेल: क्या अजगर में अपरिवर्तनीय संग्रह भी हैं? –

+5

हां, ऐसी चीजें हैं जिन्हें ["tuples"] कहा जाता है (http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences) जो अपरिवर्तनीय हैं। '> (1, 2, 3) # tuple (अपरिवर्तनीय सरणी)' '> [1, 2, 3] # सूची (म्यूटेबल सरणी)' –

95

वहाँ एक तरह से बनाया गया है नहीं है, लेकिन मैं सिर्फ आम तौर पर mutableCopy इस तरह का उपयोग करें:

NSMutableArray *array = [@[ @"1", @"2", @"3" ] mutableCopy]; 
+3

यह कम कुशल लगता है और '[NSMutableArray arrayWithObjects: @" 1 ", @" 2 ", @" 3 ", nil] से बहुत छोटा नहीं है। – ma11hew28

+8

यह वास्तव में है, लेकिन @MattDiPasquale ने एक शाब्दिक वाक्यविन्यास के लिए कहा ... – Anne

+1

या वैकल्पिक रूप से: "एनएसएमयूटेबलएरे * सरणी = [एनएसएमयूटेबलएरे ऐरेविथअरे: @ [@" 1 ", @" 2 ", @" 3 "]];" - हालांकि मुझे आपका उदाहरण बेहतर पसंद है :) – Marchy

17

लेकिन, एक NSMutableArray या एक NSMutableDictionary बनाने के लिए एक शाब्दिक वाक्य रचना है?

सं बेस्ट विकल्प:

[@[ @"foo", @"bar"] mutableCopy] 
4

आप सरणियों और शब्दकोशों की एक नेस्टेड शाब्दिक है, तो आप इस एक पूरी तरह से परिवर्तनशील संस्करण में NSJSONSerialization माध्यम से जा रहा द्वारा बदल सकते हैं। उदाहरण के लिए:

NSArray* array = @[ @{ @"call" : @{ @"devices" : @[ @"$(devices)" ] } } ]; 
NSData* data = [NSJSONSerialization dataWithJSONObject:array 
               options:0 
                error:nil]; 

NSJSONReadingOptions options = NSJSONReadingMutableContainers | 
           NSJSONReadingMutableLeaves; 
NSMutableArray* mutableArray = [NSJSONSerialization JSONObjectWithData:data 
                   options:options 
                   error:nil]; 

यह एक चक्कर का एक सा है, लेकिन कम से कम आप अपने आप को कोड को लिखने के लिए नहीं है। और अच्छी बात यह है कि NSJSONSerialization बहुत तेज़ है।

+1

उह दोस्त, JSONKit तेज़ है। 5x तक। इसके अलावा, यह बहुत सर्किट है। बस -mutableCopy का उपयोग करें, तो आप वैकल्पिक रूप से उपयोग कर सकते हैं --autorelease। –

+1

@NathanielSymer दोस्त पर आओ: दो साल पुराना [JSONKit] (https://github.com/johnezang/JSONKit) readme --well बनाए रखा सामान btw - स्वयं कहता है कि यह केवल 25% - 40% तेज था। और ['-mutableCopy' केवल एक उथली प्रतिलिपि करता है] (http://stackoverflow.com/questions/8661770/does-mutablecopy-make-contained-objects-mutable)। एकमात्र तरीका कुछ 'सर्किट' करना है। –

+1

आप यह भी कर सकते हैं: [[एनएसएमयूटेबलएरे ऐलोक] initWithArray: @ [@ "ए", @ "बी"]]। डाउनवोट के लिए खेद है, लेकिन धारावाहिक और deserializing पागल है और कई प्रकार की वस्तुओं के साथ काम नहीं करेगा। – kritzikratzi

6

हां। लेकिन काफी नहीं। इस पर एक नजर डालिए;

NSMutableArray *list = [@[] mutableCopy];

यह एक गैर-परिवर्तनशील सरणी @[] बनाता है और mutableCopy जो एक NSMutableArray * रिटर्न कहता है। @[] के स्थान पर, आप किसी भी सरणी को शाब्दिक दे सकते हैं।

+0

क्या आप लंबे समय के बदले इसका उपयोग करने से उत्पन्न होने वाले किसी भी मुद्दे के बारे में जानते हैं? –