2012-02-08 13 views
20

निम्नलिखित मेरी ज फ़ाइल में है:प्रारंभ करने NSDictionary

NSDictionary *originalValues; 
    @property (nonatomic, retain) NSDictionary *originalValues; 

यह NSDictionary init करने के लिए मीटर फ़ाइल है।

@synthesize originalValues; 

- (void)viewDidLoad { 

// copy original values when view loaded 
originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:place.city, @"city", place.cuisine, @"cuisine", 
       place.latitude, @"latitude", place.longitude, @"longitude", place.name, @"name", place.rating, 
       @"rating", place.state, @"state", place.street, @"street", place.telephone, @"telephone", 
       place.timesVisited, @"times visited", place.uppercaseFirstLetterOfName, @"first letter", 
       place.website, @"website", place.zipcode, @"zipcode", nil]; 
} 

समस्या केवल पहली चार वस्तुएं और कुंजी जोड़ रही हैं। उसके बाद, उन्हें place.name, @ "name" से शुरू होने वाले शब्दकोश में जोड़ा नहीं जा रहा है। मैंने पूरे शब्दकोश पर एक एनएसएलॉग किया था और मेरे द्वारा उल्लेखित पहले चार मूल्यों की एकमात्र चीजें थीं, इसलिए मैंने जगह पर एनएसएलॉग किया था। नाम और यह एक मूल्य आउटपुट कर रहा है, इसलिए मुझे पता है कि इस कुंजी/मूल्य के लिए कुछ भी आउटपुट किया जाना चाहिए जोड़ी। क्या वहां कुछ ऐसा है, जिसकी कमी मुझे यहां खल रही है? मुझे उत्सुकता है कि सभी मूल्यों को शुरुआत में NSDictionary में क्यों नहीं जोड़ा जा रहा है?

उत्तर

43

कारण क्यों नहीं जोड़ा जा रहा है क्योंकि एक वस्तु शून्य है जो शब्दकोश के अंत को चिह्नित करती है। आपको यह सुनिश्चित करने की ज़रूरत है कि प्रत्येक ऑब्जेक्ट nil नहीं है और यदि यह है तो आप इसके स्थान पर [NSNull null] का उपयोग कर सकते हैं। उचित मेमोरी प्रबंधन के लिए self.originalValues = ... का भी उपयोग करें। बस सुनिश्चित करें कि शब्दकोश चेक का उपयोग कभी भी करता है/NSNull मानों को संभाल सकता है।

उदाहरण gnu ternary extension का उपयोग कर:

self.originalValues = [[NSDictionary alloc] initWithObjectsAndKeys: 
         place.city ?: [NSNull null], @"city", 
         place.cuisine ?: [NSNull null], @"cuisine", 
         place.latitude ?: [NSNull null], @"latitude", 
         place.longitude ?: [NSNull null], @"longitude", 
         place.name ?: [NSNull null], @"name", 
         place.rating ?: [NSNull null], @"rating", 
         place.state ?: [NSNull null], @"state", 
         place.street ?: [NSNull null], @"street", 
         place.telephone ?: [NSNull null], @"telephone", 
         place.timesVisited ?: [NSNull null], @"times visited", 
         place.uppercaseFirstLetterOfName ?: [NSNull null], @"first letter", 
         place.website ?: [NSNull null], @"website", 
         place.zipcode ?: [NSNull null], @"zipcode", 
         nil]; 
+2

@TReddy मैं से बचने कि मेरे सारे C और C++ में त्रिगुट अभिव्यक्ति कोडिंग। लेकिन चूंकि यह उद्देश्य-सी है जो आमतौर पर केवल जीसीसी या ऐप्पल के एलएलवीएम का उपयोग करके संकलित होता है, मुझे इसका उपयोग करने में कोई समस्या नहीं होती है। – Joe

54

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

originalValues = @{ @"city"  : place.city, 
        @"latitude" : place.latitude, 
        // etc. 
        }; 
+0

जबकि शाब्दिक वाक्यविन्यास बहुत अच्छा और पसंदीदा है, मुझे यकीन नहीं है कि ओपी एक रनटाइम त्रुटि की तलाश में है जब एक मान 'शून्य 'है। – Joe

0

किसी भी शब्दकोश में आकस्मिक नहीं के बराबर सबसे अच्छा समाधान होगा से बचने के लिए अगर आप शाब्दिक और

self.originalValues = @{ @"city" : (place.city ?: @"city"), 
         @"latitude" : (place.latitude ?: [NSNull null]), 
         // etc. 
         }; 

नोट की तरह त्रिगुट ऑपरेटर का उपयोग दो टेकनीक गठबंधन:

(anyValueOrVariable?: @ "anyOtherValueOrVariable")

एक उत्थान है और

(anyValueOrVariable! = 0) जैसा ही है? anyValueOrVariable: @ "anyOtherValueOrVariable"