2010-06-01 5 views
16

Possiedo un NSMutableArray che sto tentando di memorizzare e accedere ad alcune strutture. Come faccio a fare questo? 'addObject' mi dà un errore che dice "Tipo incompatibile per argomento 1 di addObject". Ecco un esempio ('in' è un NSFileHandle, 'allineamento' è il NSMutableArray):Strutture di cacao e 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); 
} 

risposta

45

Come accennato, NSValue può avvolgere una struct semplice utilizzando +value:withObjCType: o -initWithBytes:objCType::

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

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

Vedere la Number and Value guide per ulteriori esempi.

+0

voti in su stanno dicendo tutto :) – TheTiger

+1

Non so chi sei, ma ti troverò e ti farò una birra! – CjCoax

3

Hai trovato errori perché NSMutableArray può accettare solo riferimenti agli oggetti, così si dovrebbe avvolgere le struct in una classe:

@interface PointClass { 
    struct Point p; 
} 

@property (nonatomic, assign) struct Point p; 

in questo modo, è possibile passare in casi di PointClass.

Modifica: Come accennato sopra e sotto, NSValue fornisce già questo in un modo più generico, quindi è necessario andare con quello.

+5

NSValue fornisce già la funzionalità necessaria. – JeremyP

2

È possibile utilizzare NSValue o, in alcuni casi, potrebbe essere opportuno utilizzare un dizionario anziché una struttura.