2009-05-21 16 views
11

मैं एक iPhone आवेदन में एक चेक कर रहा हूँ - "। सूचक और पूर्णांक के बीच तुलना"यदि मैं उद्देश्य-सी में एक आदिम शून्य हूं तो मैं कैसे परीक्षण करूं?

int var; 
if (var != nil) 

यह काम करता है, लेकिन एक्स-संहिता में यह एक चेतावनी पैदा कर रहा है मैं इसे कैसे ठीक करूं?

मैं जावा दुनिया से आया हूं, जहां मुझे पूरा यकीन है कि उपरोक्त कथन शिकायत पर असफल होगा।

उत्तर

33

प्रिमिटिव nil नहीं हो सकता। nil ऑब्जेक्टिव-सी ऑब्जेक्ट्स के पॉइंटर्स के लिए आरक्षित है। nil तकनीकी रूप से एक सूचक प्रकार है, और मिश्रित पॉइंटर्स और पूर्णांक एक कास्ट के बिना पूर्णांक हमेशा एक कंपाइलर चेतावनी में परिणाम देगा, एक अपवाद के साथ: पूरी तरह से पूर्णांक को पूर्णांक 0 को एक पॉइंटर में बिना किसी कलाकार के रूपांतरित करना ठीक है।

आप 0 और "कोई मूल्य" के बीच अंतर करना चाहते हैं, NSNumber वर्ग का उपयोग करें:

NSNumber *num = [NSNumber numberWithInt:0]; 
if(num == nil) // compare against nil 
    ; // do one thing 
else if([num intValue] == 0) // compare against 0 
    ; // do another thing 
10
if (var) { 
    ... 
} 

सी की अद्भुत दुनिया में आपका स्वागत है। कोई भी मान पूर्णांक 0 या शून्य सूचक के बराबर नहीं है।

लेकिन आपके पास एक बग है: इनट्स शून्य नहीं हो सकते हैं। वे जावा में जैसे मूल्य प्रकार हैं।

आप "बॉक्स" पूर्णांक चाहते हैं, तो आप अपने पते के लिए यह पूछना चाहिए:

int can_never_be_null = 42; // int in Java 
int *can_be_null = &can_never_be_null; // Integer in Java 
*can_be_null = 0; // Integer.set or whatever 
can_be_null = 0; // This is setting "the box" to null, 
        // NOT setting the integer value 
+0

सब कुछ है, हालांकि काम करने के लिए प्रतीत होता है, जहां एक मामले में जहां यह मेरे समस्याओं देना होगा है? बस कुछ पृष्ठभूमि के लिए - "var" डोमेन ऑब्जेक्ट में एक प्रॉपर्टी है। मेरे व्यू कंट्रोलर में से एक में, मेरे पास एक UISegmentedViewController है जिसका उपयोग "var" के मान को सेट करने के लिए किया जाता है। इसलिए, उपयोगकर्ता कुछ भी चुनने से पहले, var अभी तक सेट नहीं किया गया है। – bpapa

+0

var == 0 अगर यह अभी तक सेट नहीं किया गया है –

+0

सुनिश्चित करें कि यह सेट किया गया है - इसे एक अपरिभाषित मान पर सेट किया गया है। स्याही * केवल * अभिन्न मूल्यों पर ले सकते हैं। आपको 0 के खिलाफ तुलना करना चाहिए या आपको 'var' मान्य है या नहीं, यह निर्धारित करने के लिए आपको अलग-अलग BOOL ध्वज का उपयोग करना चाहिए। –