2011-08-16 19 views
39

एक पियानो ऐप में, मैं ब्लैक कुंजियों के निर्देशांक असाइन कर रहा हूं। त्रुटि के कारण कोड की रेखा यहां दी गई है।"अभिव्यक्ति असाइन करने योग्य नहीं है" - एक्सकोड में दो अन्य फ्लोट्स के योग के रूप में फ़्लोट असाइन करने में समस्या?

'blackKey' और 'whiteKey' दोनों customViews

blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width); 
यह कर की
+0

ध्यान दें कि 'whiteKey.frame.origin.x + whiteKey.frame.size.width' के रूप में' एक ही है CGRectGetMaxX (whiteKey.frame) '। – ThomasW

उत्तर

81

अन्य उत्तर वास्तव में व्याख्या नहीं करते यहाँ क्या हो रहा है, इसलिए इस बुनियादी समस्या है:

जब आप blackKey.center.x, लिखने blackKey.center और center.x दोनों तरह struct सदस्य तक पहुँचता लगते हैं लेकिन वे ' वास्तव में पूरी तरह से अलग चीजें हैं। blackKey.center एक संपत्ति का उपयोग है, जो [blackKey center] जैसी किसी चीज़ से बेकार है, जो बदले में objc_msgSend(blackKey, @selector(center)) जैसा कुछ है। आप objc_msgSend(blackKey, @selector(center)).x = 2 जैसे फ़ंक्शन के रिटर्न वैल्यू को संशोधित नहीं कर सकते - यह केवल सार्थक नहीं है, क्योंकि वापसी मान संग्रहीत कहीं भी सार्थक नहीं है।

तो यदि आप संरचना को संशोधित करना चाहते हैं, तो आपको एक चर में संपत्ति का रिटर्न वैल्यू स्टोर करना होगा, चर को संशोधित करना होगा, और फिर संपत्ति को नए मान पर सेट करना होगा।

+0

हम 'anObject.anNonStructProperty.anProperty = someValue' सही सेट कर सकते हैं? आप कैसे कहते हैं कि हम किसी फ़ंक्शन के रिटर्न वैल्यू को संशोधित नहीं कर सकते हैं। क्या आप समझा सकते हैं? – EmptyStack

+4

@EmptyStack: जब आप 'anObject.someProperty = something' लिखते हैं, जो '[anObject someProperty] = something' के बराबर नहीं है - इसके बजाय, यह' [anObject setSomeProperty: कुछ] 'के बराबर है। आप एक सेटर विधि को कॉल करने के लिए ऑब्जेक्ट को एक संदेश भेज रहे हैं। आप विधि के वापसी मूल्य को असाइन नहीं कर रहे हैं। असाइनमेंट की उपस्थिति सिर्फ सिंटैक्टिक चीनी है, जैसे कि सदस्य पहुंच की उपस्थिति एक गेटर विधि के लिए सिंटैक्टिक चीनी है। – Chuck

+0

मुझे अभी भी यह स्पष्ट रूप से नहीं मिलता है। यहां तक ​​कि आपके उत्तर में, 'blackKey.center' आंतरिक रूप से 'objc_msgSend (blackKey, @selector (setCenter :))' और 'objc_msgSend (blackKey, @selector (center))' सही नहीं कहता है? – Adithya

10
blackKey.center = CGPointMake (whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y); 

एक तरह से कर रहे हैं।

19

आप CGPoint (या संरचना के किसी भी मूल्य) के मूल्य को सीधे बदल नहीं सकते हैं, अगर यह किसी ऑब्जेक्ट की संपत्ति है। निम्नलिखित की तरह कुछ करो।

CGPoint _center = blackKey.center; 
_center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width); 
blackKey.center = _center; 
0

एक वैकल्पिक का उपयोग कर मैक्रो:

#define CGPOINT_SETX(point, x_value) { \ 
    CGPoint tempPoint = point;   \ 
    tempPoint.x = (x_value);   \ 
    point = tempPoint;     \ 
} 

#define CGPOINT_SETY(point, y_value) { \ 
    CGPoint tempPoint = point;   \ 
    tempPoint.y = (y_value);   \ 
    point = tempPoint;     \ 
} 

CGPOINT_SETX(blackKey.center, whiteKey.frame.origin.x + whiteKey.frame.size.width); 

या थोड़ा सरल:

CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame)); 
+1

क्या आपको वास्तव में 'करना है ... जबकि (0) '? क्या ब्लॉक स्कोप '{...}' अस्थायी चर घोषित करने के लिए पर्याप्त नहीं है (बिना किसी नाम के संभावित नाम-कॉलिंग के बिना), और बयान में बिल्कुल एक बार निष्पादित किया गया है? –

+0

@ निकोलसमिआरी मैं 'डू ... का उपयोग कर रहा हूं ... जबकि (0)' इतने लंबे समय तक कि मुझे एहसास नहीं हुआ कि '{...} 'ब्लॉक ठीक काम करते हैं। धन्यवाद। सरल बनाना। – ThomasW

+1

'करने के लिए तर्क ... जबकि (0)' यहां है: http://stackoverflow.com/questions/154136/do-while-and-if-else-statements-in-cc-macros मेरे मामले के लिए यह जरूरी नहीं है, लेकिन ऐसे मामले हैं जहां यह है। – ThomasW