2010-06-01 8 views
16

Tengo un NSMutableArray que intento almacenar y acceder a algunas estructuras. ¿Cómo hago esto? 'addObject' me da un error que dice "Tipo incompatible para el argumento 1 de addObject". Aquí hay un ejemplo ('en' es un NSFileHandle, 'array' es el NSMutableArray):Cocoa structs y 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); 
} 

Respuesta

45

Como se ha mencionado, NSValue puede envolver una estructura simple usando el +value:withObjCType: o -initWithBytes:objCType::

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

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

Véase el Number and Value guide para más ejemplos.

+0

up votos dicen todo :) – TheTiger

+1

¡No sé quién es usted, pero lo encontraré y le daré una cerveza! – CjCoax

3

se producen errores porque NSMutableArray sólo puede aceptar referencias a los objetos, por lo que debe envolver sus estructuras en una clase:

@interface PointClass { 
    struct Point p; 
} 

@property (nonatomic, assign) struct Point p; 

de esta manera, se puede pasar en los casos de PointClass.

Editar: Como se mencionó anteriormente y más adelante, NSValue ya proporciona esto de una manera más genérica, por lo que debe ir con eso.

+5

NSValue proporciona la funcionalidad que ya necesita. – JeremyP

2

Puede usar NSValue, o en algunos casos puede tener sentido utilizar un diccionario en lugar de una estructura.