2010-11-20 12 views
5

में शून्य मूल्य की जांच कैसे करें मैं अपनी अज्ञानता को स्वीकार करता हूं, मैंने अपने प्रोजेक्ट पर काम कर रहे कुछ महीनों में उद्देश्य-सी के बारे में जो कुछ भी मुझे पता है, मैंने सीखा है। मुझे यह भी निराशाजनक लगता है कि उद्देश्य-सी जटिल कैसे प्रतीत होता है कि मैंने जिस अन्य भाषा में काम किया है, उससे सरल बात क्या होगी। यह प्रश्न बिंदु में एक मामला है ...एनएसएनंबर

पहले भाग में मेरा ऐप जेएसओएन का एक गुच्छा डाउनलोड करता है जो इसे कोरडाटा स्टोर को पॉप्युलेट करने के लिए उपयोग करता है। मैं JSON को NSArrays में कनवर्ट करने के लिए ओबीजे-सी/जेएसओएन लाइब्रेरी (सीजेएसओएनडीएसएरियलाइज़र) का उपयोग करता हूं। एक कोरडाटा इकाई के लिए JSON डाउनलोड में एक फ़ील्ड है जिसमें एक नंबर ("show_id":2) होता है जो किसी अन्य इकाई में संबंधित फ़ील्ड को पहचानता है यदि अन्य या शून्य ("show_id":null) अन्यथा है। उस क्षेत्र के प्रसंस्करण में मैं का उपयोग कर एक NSNumber के लिए असाइन करें ...

NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"]; 

मैं तो जाँच करने के लिए है कि मैं एक वैध संख्या है & लिंक लाने से संबंधित रिकॉर्ड इतनी के रूप में जहां बेकार प्रसंस्करण ऐसा नहीं करने के लिए प्रयास करने से पहले की कोशिश वहाँ कोई संबंधित रिकॉर्ड नहीं है।

साथ ...

NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]); 

देता shoIndex पूछताछ ...

shoIndex: 19590600, <null>, <null> 

जहां JSON मूल्य null & था ...

shoIndex: 228300880, 51, 51 

अन्यथा।

अब तक केवल सफल जांच मैं कर दिया है साथ ...

if (![[shoIndex description] isEqualToString:@"<null>"]) { 

किसी को भी एक बेहतर तरीका बता सकते हैं क्या है?

अद्यतन ...

इसे दूसरे तरीके से shoIndex खोज रहे हैं एक NSNumber है कि कभी कभी एक NSString मूल्य @"<null>" शामिल के रूप में दिया जाता है। क्या ओब्जे-सी में isa ऑपरेटर की तरह कुछ है जो मैं shoIndex की सामग्री के प्रकार की जांच के लिए उपयोग कर सकता हूं?

टीआईए, पेड्रो।

+0

नहीं समझती क्या आपको लगता है कि वस्तु 'NSNumber' का एक उदाहरण है बनाता है के लिए चेक? – jlehr

उत्तर

10

किसी ऑब्जेक्ट की कक्षा प्राप्त करने के लिए [shoObject class] का उपयोग करें; इसलिए, के वर्ग shoObject परीक्षण करने के लिए, आप

[shoObject isKindOfClass:[NSString class]]; 

का प्रयोग करेंगे एक बार जब आप हल कर लिया है क्या मार्कर एक खाली स्ट्रिंग परिभाषित या NSNumber, आप एक मैक्रो बना सकते हैं। मैं CommonMacros.h नामक फ़ाइल में IsEmpty मैक्रो को रख कर इसके साथ करता हूं। यहां कोड है:

//Thanks Wil 
//http://wilshipley.com/blog/2005/10/pimp-my-code-interlude-free-code.html 

static inline BOOL IsEmpty(id thing) { 
    return thing == nil 
    || ([thing isEqual:[NSNull null]]) //JS addition for coredata 
    || ([thing respondsToSelector:@selector(length)] 
     && [(NSData *)thing length] == 0) 
    || ([thing respondsToSelector:@selector(count)] 
     && [(NSArray *)thing count] == 0); 
} 

फिर, कॉमनमैक्रोस आयात करने के बाद।ज, तो आप इस तरह फ़ंक्शन को कॉल कर सकते हैं:

if (IsEmpty(shotIndex)) { 
    //do stuff 
} 

यह इस समस्या का ध्यान रखना चाहिए, और यह भी, तार, सरणियों, आदि पर काम करेंगे के रूप में आप कोड से देख सकते हैं। विल शिपली के लिए धन्यवाद!

+0

धन्यवाद विल, यह एक इलाज करता है। यूआरएल को देखते हुए तुम वहाँ दे दी है मुझे लगता है कि आप पहले से ही मुझे अन्य तरीकों से मदद की है :) – Pedro

+0

मैं बहुत जल्द ही बात की थी। यदि शॉइंडेक्स खाली नहीं है तो मैं सामान करना चाहता हूं इसलिए मैंने कोशिश की! IsEmpty (shoIndex) और मेरा NSNumber सीधे उड़ता है। – Pedro

+0

हम्म, विषम, यह बहुत बुरा है। मैं इस isEqualToString जोड़ने का सुझाव देंगे: @ "" IsEmpty कोड के लिए परीक्षण, लेकिन निश्चित रूप उस मार्ग dodging के कारण आप पहली जगह में इस प्रश्न पूछा है। –

-1

उद्देश्य-सी में, यह nilnull नहीं है। तो:

if (shotIndex != nil) { 
    // its not nil 
} 
+2

यह वही है जो मैंने पहली बार कोशिश की और यह काम नहीं किया। जहां आप को अपने प्रश्न में देखते हैं, वह एनएसएलओएम एनएसएनंबर के लिए देता है जहां JSON आइटम शून्य था। – Pedro

+0

यह जेएसओएन है। यदि JSI डेटा में शॉट इंडेक्स मौजूद नहीं था, तो यह शून्य होगा। लेकिन, जैसा कि पेड्रो ने कहा, shotIndex अशक्त के मान के साथ मौजूद था, और JSON पारसर्स आप [NSNull अशक्त], नहीं शून्य के एक मूल्य दे देंगे। अधिकांश संदेश भेजना [NSNull शून्य] क्रैश हो जाएगा, इसलिए यह एक महत्वपूर्ण अंतर है। – gnasher729

0

कुछ मामलों में, जैसे NSUserDefaults में अनुपलब्ध कुंजी, आप एक खाली स्ट्रिंग के रूप में शाब्दिक @ "" वापस प्राप्त करते हैं।

यहां एनएसएनंबर के लिए मेरी सुरक्षित जांच है।

नोट यह एक जा रहा है NSNumber पहले होती है क्योंकि NSNumber isEqualToString

 id savedPin = [[NSUserDefaults standardUserDefaults] valueForKey:@"blah"]; // don't assume is created so don't type as NSNumber* 
     if (![savedPin isKindOfClass:[NSNumber class]] && [savedPin isEqualToString:@""]) { 
संबंधित मुद्दे