2010-03-10 12 views
38

का परीक्षण कैसे करें यदि मैं अभी तक कोई संपत्ति सेट कर चुका हूं तो परीक्षण करने का प्रयास कर रहा हूं। मुझे पता है कि वस्तुओं कि मुझे मिल गया है के साथ:किसी उद्देश्य-सी संरचना का डिफ़ॉल्ट मान और

CGRect ppGoalFrame; 
LocalPlaySetup *localPlaySetup; 

और मैं

if (localPlaySetup == nil) 

परीक्षण कर सकते हैं, लेकिन मैं == नहीं के बराबर या == शून्य

if (ppGoalFrame == nil) 
साथ CGRect परीक्षण करने के लिए प्रयास करता है, तो

मैं

invalid operands to binary == (have 'CGRect' and 'void *') 

तोहै"शून्य", शून्य, शून्य ...? सेट करने से पहले? जाहिर है, मैं एक शून्य पॉइंटर पर सीजीएफ़ की तुलना नहीं कर सकता (मैं ppGoalFrame == void का उपयोग नहीं कर सकता); क्या इसका परीक्षण करने का कोई और तरीका है? उद्देश्य-सी अब तक समझने में बहुत आसान है लेकिन जैसे ही सी लूम करता है, मैं थोड़ा खो जाता हूं।

उत्तर

89

केवल पॉइंटर्स शून्य हो सकते हैं। सीजीआरईटी एक संरचना है - यह स्मृति के एक संगत ब्लॉक का प्रतिनिधित्व करता है। यह बताने का एकमात्र तरीका है कि इसे अपनी सामग्री जांचने के लिए सेट किया गया है या नहीं।

ऐप्पल स्थिर CGRectNull प्रदान करता है। आप अपने चर को इस पर सेट कर सकते हैं और यह निर्धारित करने के लिए CGRectIsNull फ़ंक्शन का उपयोग कर सकते हैं कि यह सेट किया गया है या नहीं। CGRectNullCGRectZero जैसा नहीं है, इसलिए वांछित मान शून्य होने पर आपको चिंता करने की आवश्यकता नहीं है।

ध्यान दें कि CGRectNull में केवल एक सीजीआरईटी संरचना है जो मूल्यों से भरी हुई है जो ऐप्पल बाद में CGRectIsNull फ़ंक्शन की पहचान कर सकती है। पॉइंटर्स की तुलना करते समय यह वही शून्य नहीं है।

+22

परीक्षण करने के लिए CGRectIsEmpty का उपयोग करके समाप्त हुआ। उन्हें किसी भी तरह से सेट करने की ज़रूरत नहीं है। हालांकि, आपका जवाब मुझे सही रास्ते पर मिला, इसलिए धन्यवाद। – typeoneerror

0

मुझे नहीं लगता कि आप सी संरचना की द्विआधारी तुलना कर सकते हैं, जो what CGRect is है। एक त्वरित Google खोज और सी फॉर डमीज़ डेस्क रेफरेंस की जांच करने से कुछ भी नहीं हुआ। आप CGRect ppGoalFrame घोषित कर सकते हैं, संरचना के सदस्यों को डिफ़ॉल्ट मानों के साथ प्रारंभ कर सकते हैं (यदि वे पहले से नहीं हैं), और संरचना सदस्यों का परीक्षण करें।

अद्यतन संपादित करें: यह question has been asked सी संरचनाओं के लिए।

+0

उदाहरण चर के बारे में चर्चा करते समय कहानी उद्देश्य-सी के लिए अलग है। – gavinb

+0

@gavinb: शायद। उद्देश्य-सी में डुबकी लगाने से पहले मैं अभी भी अपने सी पर ब्रश कर रहा हूं। –

44

ऑब्जेक्टिव-सी क्लास में सभी इंस्टेंस चर को शून्य में प्रारंभ किया गया है। तो सभी पॉइंटर्स nil हैं, संख्या 0 हैं, और structs शून्य हैं। चूंकि सीजीआरईटी एक सादा संरचना है, इसलिए इसे origin.x=0, origin.y=0, size.width=0, size.height=0 में शुरू किया जाएगा।

तो यह जांचने के लिए कि क्या आपका CGRect सेट किया गया है, तो आपको इसकी तुलना (मान द्वारा) शून्य से करने की आवश्यकता है। CGRectIsEmpty समारोह वास्तव में यह कर देगा:

if (CGRectIsEmpty(ppGoalFrame)) 
{ 
    // ... 
} 
+0

+1 महान जवाब। आप इसे 'CGRectIsEmpty' IMO का उपयोग करने के लिए संपादित कर सकते हैं। –

+0

@ यार धन्यवाद, सुझाए गए अनुसार अपडेट किया गया। – gavinb

+0

धन्यवाद @gavinb, यह बहुत अच्छा है। व्यक्तिगत रूप से मैं संदर्भ 'CGRectEqualToRect' को हटा दूंगा, क्योंकि यह अब "विरासत कोड" है। –

2

कोई सार्वभौमिक "कुछ भी नहीं" मूल्य नहीं है। ऑब्जेक्ट्स के लिए nil और पॉइंटर्स के लिए NULL है, लेकिन सादा मान प्रकारों के लिए कोई समकक्ष नहीं है - उनके पास कुछ मान है, भले ही यह सिर्फ बकवास है। आप मनमाना मूल्य ले सकते हैं और कह सकते हैं, "मैं इस प्रकार के लिए यह शून्य मान कहूंगा" (कहें, #define IntNull 4444444 और उम्मीद है कि कुछ गणना कभी गलती से उस मान को वापस नहीं लौटाती है), लेकिन कोई वास्तविक शून्य मूल्य नहीं है।

विशेष रूप से सीजीआरईटी के मामले में, ऐप्पल ने "मनमानी मूल्य चुनें" रणनीति का उपयोग किया और CGRectNull परिभाषित किया, लेकिन सीजीआरईटी चर डिफ़ॉल्ट रूप से उस पर सेट नहीं हैं - आपको इसे विशेष रूप से स्वयं सेट करना होगा।डिफ़ॉल्ट रूप से, CGRect आवृत्ति चर CGRectZero पर सेट होते हैं, लेकिन याद रखें कि यह 0 चौड़ाई और 0 ऊंचाई के साथ स्थान (0,0) पर केवल एक सामान्य CGRect संरचना है। और एक समारोह में स्थानीय CGRects एक पूरी तरह से अप्रत्याशित मूल्य है।

5

CGGeometry.h से:

/* Return true if `rect' is empty (that is, if it has zero width or height), 
    false otherwise. A null rect is defined to be empty. */ 

एक खाली आयत एक है कि कोई क्षेत्र है, जहां पर या दोनों पक्षों शून्य कर रहे हैं। बजाय
उपयोग:

CGRect newRect = CGRectNull; 
2

तुम भी NSValue में CGRect लपेट कर सकते हैं:

[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]

और फिर nil मूल्य से बचें।

संबंधित मुद्दे