2013-03-07 7 views
6

से असाइन करने योग्य संरचना मानों को मैं एक इकाई के रूप में तीन मानों को स्टोर करने के लिए एक संरचना का उपयोग करने की कोशिश कर रहा हूं ताकि बोल सकें। मुझे एक त्रुटि मिल रही है: "Expression not assignable" जब मैं ऑब्जेक्ट के सुपर व्यू से स्ट्रक्चर के मानों को मान असाइन करने का प्रयास करता हूं।आईओएस, उद्देश्य सी में संरचना का उपयोग करें, सुपर व्यू

किसी को भी पता है कि ऐसा क्यों है?

मेरी कक्षा के ज फ़ाइल में

मैं struct और एक संपत्ति

@interface MyClass : UIView 

{ 
    struct customStruct { 
     float a; 
     float b; 
     float c; 
    }; 

} 

@property (assign, nonatomic) struct customStruct myStruct; 

मैं एक मूल्य निर्दिष्ट करने की कोशिश सुपर देखने से परिभाषित किया है और मैं कोई त्रुटि मिलती है: "Expression not assignable"

object.myStruct.a = someValue; 

उत्तर

18

कोशिश इस:

struct customStruct aStruct = object.myStruct; 
aStruct.a = someValue; 
object.myStruct = aStruct 

यह बिल्कुल ऐसा करने में सक्षम नहीं होने के रूप में एक ही स्थिति है:

view.frame.size.width = aWidthValue; 

बीटीडब्ल्यू एक वर्ग इंटरफ़ेस के अंदर एक संरचना घोषित करना एक बहुत ही खराब शैली की तरह लगता है। यह बहुत क्लीनर है:

typedef struct { 
    float a; 
    float b; 
    float c; 
} customStruct; 

@interface MyClass : UIView 

@property (assign, nonatomic) customStruct myStruct; 
+2

यह पूरी तरह से सही नहीं है क्योंकि वह अपने संरचना सदस्य को अपडेट करना चाहता है और इसे स्क्रैच से सेट नहीं करना – giorashc

+0

धन्यवाद! जब आप कहते हैं कि "इसे आजमाएं" सुपरव्यू में उन तीन पंक्तियां हैं। क्षमा करें, लेकिन क्या आप थोड़ा सा स्पष्टीकरण दे सकते हैं? – Mrwolfy

6

ऐसा इसलिए है क्योंकि object.myStruct आपके संरचना सदस्य की एक प्रति देता है और उस प्रतिलिपि के सदस्य a को बदलने का कोई मतलब नहीं है।

आप पूरे struct सदस्य को बदलने और उसके बाद struct सदस्य फिर से सेट

2

बाहर यह परिभाषित करें/interface गुंजाइश से पहले (प्राप्त/सेट संश्लेषित तरीकों का उपयोग कर) प्राप्त करना चाहिए:

struct LevelPath{ 
    int theme; 
    int level; 
}; 

//here goes your interface line 
@interface BNGameViewController : UIViewController{ 
} 
//create propertee here 
@property (nonatomic, assign) struct LevelPath levelPath; 
1

पहले सुझाव के लिए पर जोड़ने के लिए, मैं एक संपत्ति के रूप में अपने struct, लेकिन उसके सदस्य चर की दुकान नहीं करने के लिए सुझाव देना चाहेंगे। उदाहरण के लिए:

@interface MyClass() { 

    CGPoint myPoint; 

} 

फिर अपने क्लास में नए मूल्यों को असाइन कर सकते हैं जो सीधे struct:

myPoint.x = 100.0; 
बजाय जब यह एक @property है, जो केवल पढ़ने के लिए है की

:

myPoint = CGPointMake(100.0, myPoint.y); 

यह देखते हुए कि यह एनएसओब्जेक्ट सबक्लास नहीं है, जब तक कि आप गेटर/सेटर विधियों को ओवरराइट नहीं कर लेते, मुझे इसे @property बनाने का उद्देश्य नहीं दिखाई देता है, क्योंकि यह एआरसी के लिए अधिक उपयोगी है आपके ऑब्जेक्ट्स मेमोरी मैनेजमेंट के साथ। लेकिन अगर मैं उस बिंदु (गलत) पर गलत हूं तो कृपया मुझे सही करें।

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