एनएसड्राइव में कैसे जोड़ें


93

मैं एक का उपयोग कर रहा था NSMutableArrayऔर महसूस किया कि जो मैं प्राप्त करने की कोशिश कर रहा हूं उसके लिए एक शब्दकोश का उपयोग करना बहुत सरल है।

मैं शब्दकोश में एक NSStringऔर एक मान के रूप intमें एक कुंजी को सहेजना चाहता हूं । यह कैसे किया जाता है? दूसरे, उत्परिवर्तनीय और एक सामान्य शब्दकोश में क्या अंतर है?

जवाबों:


199

एक परिवर्तनशील शब्दकोश को बदला जा सकता है, अर्थात आप वस्तुओं को जोड़ और हटा सकते हैं। इसे बनाने के बाद एक अपरिवर्तनीय तय की जाती है।

बनाएं और जोड़ें:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

और पुनः प्राप्त करें:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

क्या आपके पास एक क्षमता के साथ init है, या यह सिर्फ गतिशील हो सकता है?
muttley91

2
आपको प्रारंभिक क्षमता निर्दिष्ट करने की आवश्यकता नहीं है, लेकिन यदि आप ऐसा करते हैं, तो आपको प्रदर्शन लाभ मिल सकता है। यदि आप यह जानते हैं कि इसमें कितने आइटम होंगे, तो यह संख्या या थोड़ा बड़ा मूल्य प्रदान करें।
Eiko

NS आवश्यकता के लिए नहीं कह रहा हूँ?
अनंत प्रसाद

35

सेट करके आप ऑब्जेक्ट की setValue:(id)value forKey:(id)keyविधि का उपयोग करेंगे NSMutableDictionary:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

या आधुनिक उद्देश्य-सी में:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

उत्परिवर्तनीय और "सामान्य" के बीच का अंतर, ठीक है, पारस्परिकता है। यानी जब आप "सामान्य" और के साथ ऐसा नहीं कर सकते NSMutableDictionary(और NSMutableArray) की सामग्री को बदल सकते हैंNSDictionaryNSArray


2
क्या आपको उस पूर्णांक को एक NSNumber में नहीं लपेटना चाहिए?
जोहान कूल

मेरे पास इसके साथ एक और मुद्दा है। मुझे एक उपयोगकर्ता को टेक्स्ट के साथ-साथ स्ट्रिंग (साथ ही इमेज रेफ़रेंस (छवियों की सरणी में अनुक्रमणिका)) को संग्रहीत करने की आवश्यकता है, जिसे उपयोगकर्ता टेक्स्ट को सहेज रहा है। मैंने उन वस्तुओं का एक परस्पर उपयोग करने की कोशिश की है जिनके 2 चर हैं, जिनमें से प्रत्येक का उल्लेख मैंने किया है। जब सारणी ऑब्जेक्ट टेक्स्ट मानों के साथ तालिका दृश्य को पॉप्युलेट करने का प्रयास कर रही थी, तो वह अच्छी तरह से काम नहीं कर रही थी। इसलिए मैंने एक डिक्शनरी के बारे में सोचा, एकमात्र समस्या यह है कि मैं इंडेक्स द्वारा डेटा पुनः प्राप्त कर सकता हूं, यह हैशमप राइट की तरह एक कुंजी या मान होना चाहिए?
सिस्टम

@ जोहान - सही और अद्यतन! @alJaree - हां, शब्दकोश कुंजी-प्रकार का स्टोर है। मुझे लगता है कि आपकी स्थिति में आप शब्दकोशों के साथ बेहतर होंगे। कुछ इस तरह है[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
एइमांतास

यह अभी भी मेरे लिए काम नहीं करेगा, क्योंकि मुझे प्रत्येक ऑब्जेक्ट से पाठ को पुनः प्राप्त करने और पसंदीदा UITableView को भरने के लिए उपयोग करने की आवश्यकता है और साथ ही मुझे छवि सरणी के लिए एक इंडेक्स संदर्भ की आवश्यकता है ताकि मैं चयनित पसंदीदा छवि को पुनः प्राप्त और प्रदर्शित कर सकूं। मैंने उस ऑब्जेक्ट को आज़माया, जो मैंने ऊपर वर्णित किया था, लेकिन उस वस्तु से वापस आने वाली वस्तुएं, जहां एनएसएसट्रेस किसी कारण के लिए संग्रहीत किए गए विशिष्ट ऑब्जेक्ट के बजाय किसी कारण से पढ़ रहा था। मुझे यकीन नहीं है कि यहाँ क्या करना है,
सिस्टम

मैं सोच रहा हूँ कि मुझे NSStrings को स्टोर करने की आवश्यकता हो सकती है जैसे @ "% d _% @, index, saveTitle और फिर बस NSString को विभाजित करना और ले जाना और डुबाना जो मुझे चाहिए। मैं जावा शब्दों में सोच रहा हूँ, निश्चित रूप से एक होना चाहिए। विभाजित समारोह में obj c। :)
सिस्टम

16

जब कभी ऐरे को घोषित किया जाता है, तो केवल हमें एनएस-लाइक में की-वैल्यू को जोड़ना होता है

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

हम इस NSDictionary में प्रमुख मूल्यों को जोड़ या हटा नहीं सकते हैं

जहाँ NSMutableDictionary के रूप में हम इस विधि का उपयोग करके भी सरणी के intialization के बाद वस्तुओं को जोड़ सकते हैं

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

मुख्य मूल्य को हटाने के लिए हमें निम्नलिखित कोड का उपयोग करना होगा

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

नया संस्करण

उद्देश्य सी

सृजन करना:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

परिवर्तन:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

शॉर्ट-हैंड सिंटैक्स कहा जाता है Objective-C Literals

तीव्र

सृजन करना:

var dictionary = ["myKey1": 7, "myKey2": 5]

परिवर्तन:

dictionary["myKey3"] = 3

1

आप पूछना चाहते हैं कि "एक उत्परिवर्तनीय और एक गैर-उत्परिवर्ती सरणी या शब्दकोश में क्या अंतर है।" कई बार उन चीजों का वर्णन करने के लिए विभिन्न शब्दों का उपयोग किया जाता है जिनके बारे में आप पहले से जानते हैं। इस मामले में, आप "परिवर्तनशील" शब्द को "गतिशील" से बदल सकते हैं। तो, एक परिवर्तनशील शब्दकोश या सरणी वह है जो "गतिशील" है और रनटाइम में बदल सकती है, जबकि एक गैर-परिवर्तनशील शब्दकोश या सरणी वह है जो "स्थिर" है और आपके कोड में परिभाषित है और रनटाइम में नहीं बदलता है (दूसरे शब्दों में) , आप तत्वों को जोड़ते, हटाते या संभवतः छांटते नहीं होंगे।)

जैसा कि यह कैसे किया जाता है, आप हमें यहां दस्तावेज दोहराने के लिए कह रहे हैं। आपको बस इतना करना है कि यह कैसे किया जाता है यह देखने के लिए नमूना कोड और Xcode प्रलेखन में खोज करना है। लेकिन जब मुझे पहली बार सीखने को मिला, तब मुझे यह पता चला।


कभी-कभी Xcode डॉक्स पर एक पर्याप्त पर्याप्त व्याख्या नहीं होती है, यह हमेशा स्पष्ट उदाहरणों के बिना गहरे सिद्धांत में मिलती है, हमेशा नहीं, लेकिन कभी-कभी। : पी हाँ, मैं अब समझ में आता है कि उत्परिवर्तित (उत्परिवर्तित करने में सक्षम) धन्यवाद। :)
सिस्टम

0

संदर्भ के लिए, आप एक शाब्दिक initWithDictionaryके NSMutableDictionaryसाथ init का उपयोग कर सकते हैं :

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.