2010-06-01 16 views
16

मेरे पास एक एनएसएमयूटेबलएरे है जिसे मैं कुछ structs को स्टोर और एक्सेस करने का प्रयास कर रहा हूं। मैं यह कैसे करु? 'addObject' मुझे एक त्रुटि देता है "addObject के तर्क 1 के लिए असंगत प्रकार"।कोको structs और NSMutableArray

//Write points 
for(int i=0; i<5; i++) { 
    struct Point p; 
    buff = [in readDataOfLength:1]; 
    [buff getBytes:&(p.x) length:sizeof(p.x)]; 
    [array addObject:p]; 
} 

//Read points 
for(int i=0; i<5; i++) { 
    struct Point p = [array objectAtIndex:i]; 
    NSLog(@"%i", p.x); 
} 

उत्तर

45

जैसा कि बताया जा NSValue+value:withObjCType: या -initWithBytes:objCType: का उपयोग कर एक सादे struct लपेट कर सकते हैं:

// add: 
[array addObject:[NSValue value:&p withObjCType:@encode(struct Point)]]; 

// extract: 
struct Point p; 
[[array objectAtIndex:i] getValue:&p]; 

अधिक उदाहरण के लिए Number and Value guide देखें।

+0

ऊपर वोट सबकुछ कह रहे हैं :) – TheTiger

+1

मुझे नहीं पता कि आप कौन हैं, लेकिन मैं आपको ढूंढूंगा और आपको एक बियर प्राप्त करूंगा! – CjCoax

3

आप त्रुटियों हो रही है क्योंकि NSMutableArray केवल, वस्तुओं के लिए संदर्भ स्वीकार कर सकते हैं ताकि आप एक कक्षा में अपने structs लपेट चाहिए: यहाँ एक उदाहरण (NSMutableArray 'में' एक NSFileHandle है, 'सरणी' है) है:

@interface PointClass { 
    struct Point p; 
} 

@property (nonatomic, assign) struct Point p; 

इस तरह, आप PointClass के उदाहरणों में पारित कर सकते हैं।

संपादित करें: जैसा ऊपर और नीचे बताया गया है, NSValue पहले से ही इसे अधिक सामान्य तरीके से प्रदान करता है, इसलिए आपको इसके साथ जाना चाहिए।

+5

NSValue आपको पहले से आवश्यक कार्यक्षमता प्रदान करता है। – JeremyP

2

आप NSValue का उपयोग कर सकते हैं, या कुछ मामलों में यह संरचना के बजाय एक शब्दकोश का उपयोग करने के लिए समझ में आता है।