2013-06-07 2 views
8

में मैं अपने कोड से अटे पड़े लगाने के लिए शुरू कर रहा हूँ:अशक्त करने के लिए की तुलना करें उद्देश्य सी

if([p [email protected]"somekey"] != [NSNull null]) { 

} 

वहाँ कम (चरित्र वार) शून्य के लिए तुलना है?

पृष्ठभूमि: मैं एक JSON स्ट्रिंग को पार्स करने के लिए एसबीजेसन लाइब्रेरी का उपयोग कर रहा हूं और कुछ चाबियों के लिए अक्सर शून्य मान (डिज़ाइन द्वारा) होते हैं।

+0

objectForKey विधि वापस नहीं करता है [NSNull अशक्त]। यह शून्य आता है। – jarmod

+0

यह आपको एक झूठी सकारात्मक दे सकता है। यदि '[p objectForKey: @" someKey "]' nil' देता है, तो आपका परीक्षण पास हो जाएगा। –

+1

यदि यह शब्दकोश में है तो यह '[NSNull null] 'देता है। –

उत्तर

7

कुछ भी अंतर्निहित नहीं है, लेकिन यह MYIsNull() फ़ंक्शन बनाने के लिए उचित और सरल होगा जो आपकी इच्छित तुलना करेगा। बस इस मामले में वापस लौटना चाहते हैं कि कुंजी गुम है।

आप अन्य तरीकों से जाना चाहते हैं और -null को nil में बदल सकते हैं। उदाहरण के लिए, आप NSDictionary इस तरह पर एक वर्ग जोड़ सकते हैं:

- (id)my_nonNullObjectForKey:(NSString *)key { 
    id value = [self objectForKey:key]; 
    if ([value isEqual:[NSNull null]) { 
    return nil; 
    } 
    return value; 
} 
+0

मुझे यह समाधान पसंद है। हम उद्देश्य-सी प्रोग्रामर का उपयोग 'शून्य' से निपटने के लिए और अधिक उपयोग किया जाता है, और हमारे सामान्य पैटर्न जैसे 'if (! MyString) ... का उपयोग करने में सक्षम होने के नाते एक बड़ा प्लस है। – bdesham

+3

उस विधि को उपसर्ग करें, कृपया, यदि आप इसे 'NSDictionary' पर श्रेणी के रूप में जोड़ते हैं। – bbum

+0

डांगिट; शिक्षक ने मुझे पकड़ा फिक्स्ड। –

-4

सुंदर यकीन है कि तुम सिर्फ कह सकते हैं

if ([p objectForKey:@"somekey"]) { 

} 

मैं NSNull का उपयोग नहीं करते ज्यादा तो मैं 100% यकीन नहीं है लेकिन मैं इसे के रूप में झूठे और सच के रूप में किसी अन्य वस्तु परीक्षण परीक्षण लगता है।

+4

यदि 'कुछकी' के लिए मूल्य वास्तव में 'NSNull' है, तो यह परीक्षण पास हो जाएगा। यह अगर कथन 'if ([p objectForKey: @ "someKey"] == nil) ' –

+1

मैं डाउनवॉटेड हूं क्योंकि मुझे यकीन है कि यह गलत है। क्या आप इसे सुनिश्चित करने के लिए परीक्षण कर सकते हैं? – bdesham

4

मैं का प्रयोग करेंगे

if([[p [email protected]"somekey"] isEqual:[NSNull null]] || ![p [email protected]"somekey"]) { 
    // NSNull or nil 
} else { 
    // Stuff exists...Hurray! 
} 

यह काम करने के लिए के बाद से [NSNull null] एक "वस्तु" वास्तव में लग रहे हैं। आशा करता हूँ की ये काम करेगा!

+2

बेहतर कोडिंग के दौरान, यह ओपी के लक्ष्य की विपरीत दिशा में काम करता है (इसमें यह वास्तव में जो भी बदलता है उससे अधिक लंबा है)। –

+1

यह सबसे अच्छा समाधान है। –

+0

यह वास्तव में वास्तविक प्रश्न का उत्तर नहीं देता है? –

2

नहीं, आप NSNull के लिए परीक्षण करने के लिए है। हालांकि, अगर आपको लगता है कि आपका कोड इसके द्वारा परेशान किया जा रहा है, तो आप इसके लिए #define बनाना चाहेंगे।

मन भी है कि अगर p नहीं के बराबर है, या यदि psomeKey के लिए एक मूल्य नहीं है, तो [p [email protected]"somekey"] != [NSNull null]YES का मूल्यांकन में भालू।

तो आप शायद कुछ इस तरह हैं:

#define IsTruthy(X) (X && (X != [NSNull null])) 
1

वहाँ कम (चरित्र वार) शून्य के लिए तुलना है?

[NSNull null] 13 वर्ण हैं। आप कह सकते हैं:

NSNull.null // << 11 
(id)kCFNull // << 11 

या एक समारोह बनाने:

IsNSNull([p [email protected]"somekey"]) // << 10 in this case and requires no ==, != 

या (cringes) एक वर्ग का उपयोग करें:

[p [email protected]"somekey"].mon_isNSNull // << 13 in this case, but requires no ==, != 

बस सावधान कैसे आप उस श्रेणी का नाम जब nil के साथ काम किया रिसीवर।

0

चूंकि आप SBJSON का उपयोग कर रहे हैं, तो आप आसानी से अपना कोड बदल सकते हैं - आपके पास स्रोत है।

मैंने वास्तव में पार्सर को [NSNull null] मानों को छोड़ने के लिए संशोधित किया है।उन्हें शब्दकोश में जोड़ा नहीं जाता है और जब मैं objectForKey: पर कॉल करता हूं, तो मुझे कभी भी [NSNull null] नहीं मिलता है, मुझे बस nil मिलता है। फिर, ज्यादातर परिस्थितियों में मुझे यह भी जांचना नहीं है कि nil पर कोई विधि कॉल करने के बाद मान nil है, आमतौर पर परिणाम मुझे उम्मीद है।

0

तुम सिर्फ समय की राशि आपके टाइप करने के लिए लेने के बारे में चिंतित हैं, मैक्रो पर विचार करें:

#define ISNULL(key) [p objectForKey:key] == [NSNull null] 

तो

if (!ISNULL(@"somekey")) ... 
संबंधित मुद्दे