2013-04-18 15 views
23

मैं अगर एक CGRect मेरी संपत्ति गेटर में null है की जाँच करने के कोशिश कर रहा हूँ और अगर ऐसा है, डिफ़ॉल्ट रूप से एक मूल्य के लोड में CGRect अशक्त, हालांकि, मेरी init विधि में, जब मैं संपत्ति का उपयोग करें, यह शून्य रिटर्न सभी मूल्यों के लिए।चेक अगर गेटर

- (CGRect)frame 
{ 
    if(CGRectIsNull(_frame)) 
     _frame = CGRectMake(0,0,60,60); 
    return _frame; 
} 

- (id)init 
{ 
    self = [super initWithFrame:self.frame]; 
    if(self) 
    { 
     //do something 
    } 
    return self; 
} 

मुझे यकीन है कि क्या हो रहा है और जहां देखने के लिए है नहीं कर रहा हूँ:

यहाँ मेरी गेटर है। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

उत्तर

49

प्रयास करें जब आप अपने वर्ग का एक उदाहरण बनाने के लिए, _frame उदाहरण चर स्वचालित रूप से आरंभ नहीं हो जाता, पहले भी init विधि कहा जाता है। चूंकि _frame एक सी-स्ट्रक्चर (CGRect) है, इसकी स्मृति सभी शून्यों को साफ़ कर दी गई है। इसका परिणाम सभी शून्य मानों के साथ CGRect में होता है।

CGRectNull एक विशेष, गैर-शून्य CGRect है। तो CGRectIsNull() का उपयोग करके आपकी जांच कभी भी सच नहीं होगी।

CGRectIsEmpty का उपयोग करना इसके लिए एक और अधिक उचित जांच है।

+5

'CGRectIsEmpty' यहां जाने के लिए बेहतर तरीका है, लेकिन मुझे लगता है कि उल्लेखनीय है कि आप 'CGRectEqualToRect' का भी उपयोग कर सकते हैं और' CGRectZero' –

+1

से तुलना कर सकते हैं लेकिन 'CGRectIsEmpty (_frame) 'का उपयोग करके' CGRectEqualToRect (_frame, CGRectZero) 'से छोटा है। – rmaddy

+0

यह है, और CGRectIsEmpty भी मेरी वरीयता होगी, बस इसे इंगित करें :) –

10

- (CGRect)frame 
{ 
    if (CGRectIsEmpty(_frame)) 
    _frame = CGRectMake(0,0,60,60); 

    return _frame; 
} 
0

यहाँ आप बस अब CGRectNull के लिए जाँच करने CGRect के isNull बूलियन संपत्ति का उपयोग करने में सक्षम हैं स्विफ्ट 4 के लिए एक अद्यतन जवाब है:

let someRect = CGRect.null 
print(someRect.isNull) // true 
संबंधित मुद्दे