2012-01-19 12 views
17

मैं शुरुआत में एक विशेष बिंदु (स्क्रीन के बीच) में एक CGPoint प्रॉपर्टी सेट करना चाहता हूं। बाद में अन्य विधियां इस संपत्ति को बदलना चाहती हैं। मेरे विचार गेटटर में खाली होने पर इसे शुरू करना था, लेकिन मुझे संदेश को अमान्य अभिव्यक्ति के लिए अमान्य तर्क प्रकार 'संरचना CGPoint' मिलता है। मैंने संपत्ति == शून्य या 0 का उपयोग करने का भी प्रयास किया लेकिन कोई खुशी नहीं।मैं कैसे जांचूं कि एक CGPoint प्रारंभ किया गया है या नहीं?

किसी भी विचार?

-(CGPoint)graphOrigin 
{ 
    // initialise to centre of screen if has not been set 
    if(!_graphOrigin) // this expression is causing the problem 
    { 
     CGPoint origin = CGPointMake(self.bounds.origin.x + self.bounds.size.width/2, self.bounds.origin.y + self.bounds.size.height/2); 

     _graphOrigin = origin; 
    } 

return _graphOrigin; 

}

उत्तर

29

एक CGPoint एक struct है, इसलिए आप इसे शून्य या नल पर सेट नहीं कर सकते (यह एक सूचक नहीं है)। एक मायने में, वास्तव में कोई "अनियमित" राज्य नहीं है। शायद आप {0.0, 0.0} का उपयोग CGPoint को अनसेट करने के लिए कर सकते हैं, लेकिन यह एक वैध समन्वय भी है। या आप ऋणात्मक x और y मानों का उपयोग "अनियमित" बिंदु को ध्वजांकित करने के लिए कर सकते हैं, क्योंकि ऋणात्मक मान मान्य ड्राइंग पॉइंट नहीं हो सकते हैं, लेकिन यह एक हैक भी है।

  1. स्टोर एक CGPoint के सूचक के रूप संपत्ति:

    शायद आपका सर्वश्रेष्ठ दांव दो चीजों में से एक करना है। अनियमित होने पर यह मान NULL पर सेट किया जा सकता है। बेशक, आपको malloc आईएनजी और free मूल्य के बारे में चिंता करने की ज़रूरत है।

  2. स्टोर CGPoint एक BOOL साथ pointInitialized कहा जाता है या somesuch, शुरू में NO करने के लिए सेट है, लेकिन YES करने के लिए सेट एक बार बिंदु से प्रारंभ किया गया है। तुम भी है कि लपेट कर सकते हैं एक struct में:

    struct { 
        CGPoint point; 
        BOOL initialized; 
    } pointData; 
    
+3

मुझे यह उत्तर बहुत पसंद है, क्योंकि ** {0.0, 0.0} ** वास्तव में एक मौजूदा और वैध समन्वय है। इसका उपयोग नल-पॉइंट के रूप में आपके प्रोग्राम तर्क को तोड़ सकता है। – Stas

+1

CGPoint को -1 तक सेट करना, -1 अन्य सुझावों की तुलना में मेरे लिए कम हैकिश लगता है। एक अलग बुलियन वैरिएबल जोड़ना एक सिंगल प्वाइंट ऑफ ट्रुथ उल्लंघन की तरह लगता है - यदि यह वैरिएबल की स्थिति बदल जाती है तो यह गलत नहीं होगा। – arlomedia

+0

शायद भयानक प्रोग्रामिंग, लेकिन यदि आप बेताब हैं तो आप हमेशा अपने CGPoint के समन्वय के रूप में {NAN, NAN} पास कर सकते हैं। – Tommyixi

10

CGPoint एक गैर-आरंभिकृत राज्य नहीं है। हालांकि, अगर आप बिंदु पर विचार (0, 0) अप्रारंभीकृत के रूप में, आप इस्तेमाल कर सकते हैं

if (_graphOrigin.x == 0 && _graphOrigin.y == 0) 
{ 
    ... 

यह काम करता है, क्योंकि जब एक ऑब्जेक्टिव-सी उदाहरण आरंभ नहीं हो जाता, अपने सभी इवर शून्य के टुकड़े करने के लिए मंजूरी दी जाती है, जिसमें CGFloat प्रतिनिधित्व 0.0 है।

(नोट: == यहाँ ठीक है, भले ही ऑपरेंड CGFloat हैं क्योंकि हम -0) के मुद्दे की अनदेखी कर एक सटीक बिट पैटर्न के साथ तुलना करने के लिए (चाहते हैं)

+0

ठीक काम करता है,:

बिंदु बाद में प्राप्त करने के लिए बस का उपयोग करें! – Alan

+9

(0, 0) एक वैध समन्वय है – jjeaton

+0

सच है कि @jjeaton – abbood

21

एक आसान तरीका CGRectZero को _graphOrigin प्रारंभ करते हैं और इस के लिए अपने अगर बयान बदलने के लिए होगा:

if (!CGPointEqualToPoint(_graphOrigin, CGPointZero)) { 

} 
0

दो CGPoint गुण बनाएँ, इस तरह वे दोनों "अनियमित" हैं। उनमें से एक सेट करें और यह जांचने के लिए दूसरे का उपयोग करें कि वे बराबर हैं या नहीं।

@interface ClassName() 

@property (nonatomic) CGPoint point1; 
@property (nonatomic) CGPoint point2; 

@end 

@implementation ClassName 

self.point1 = CGPointMake(69.0f, 180.0f); //arbitrary numbers 

    //if not equal, then if statement proceeds 
if (!CGPointEqualToPoint(self.point1, self.point2) { 
    //your code here 
} 

@end 

आईडीके अगर आप इस तरह हैकिश पर विचार करेंगे। और मुझे पता है कि आपका प्रश्न पहले से ही उत्तर दिया गया था, लेकिन जब तक मैंने इस बारे में सोचा तब तक मुझे एक ही दुविधा थी।

5

CGPointZero (0,0) और किसी भी अन्य मूल्य चूंकि आप एक बिंदु अपने संदर्भ में मौजूद हो सकता दे आप उपयोग कर अपनी बात के साथ एक NSValue प्रारंभ कर सकते हैं:

NSValue *pointVal = [NSValue valueWithCGPoint:point]; 

आप कर सकता है इस पर आधारित कुछ शर्त और फिर बाद में एनएसवीएलयू को शून्य के लिए परीक्षण करें। NSValue को एक सरणी में भी जोड़ा जा सकता है जो आपको आवश्यक अंकों की एक सरणी रखने की अनुमति देगा। धन्यवाद

CGPoint point = [pointVal CGPointValue]; 
+0

यह समाधान आईएफ स्टेटमेंट जांच के लिए बहुत उपयोगी है अगर 'बिंदु' संरचना मौजूद है। आप जांच सकते हैं कि पॉइंटवॉल शून्य है (... अगर (पॉइंटवेल) ...), जो आप बिंदु के साथ नहीं कर सकते (... अगर (बिंदु) ... आपको एक 'अमान्य ऑपरेंड' त्रुटि देता है)। – GlennRay

0
static CGPoint kInvalidPoint = {.x = NSIntegerMax, .y = NSIntegerMax}; 

@implementation MyClass 

- init() 
{ 
    self = [super init]; 
    if (self) { 
     _oldPoint = kInvalidPoint; 
    } 
    return self; 
} 

- (void)foo 
{ 
    if (CGPointEqualToPoint(self.oldPoint, kInvalidPoint)) { 
     // Invalid point. 
     return; 
    } 
} 

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

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