objective c - sirve - ¿Cuál es la forma más fácil de crear una matriz de estructuras?
funciones con estructuras en c (5)
O asignando dinámicamente:
struct foo {
int bar;
};
int main (int argc, const char * argv[]) {
struct foo *foobar = malloc(sizeof(struct foo) * 3);
foobar[0].bar = 7; // or foobar->bar = 7;
free(foobar);
}
¿Cuál es la forma más fácil de crear una matriz de estructuras en Cocoa?
Si estás de acuerdo con una antigua matriz C normal:
struct foo{
int bar;
};
int main (int argc, const char * argv[]) {
struct foo foobar[3];
foobar[0].bar = 7;
}
Si quieres un NSArray, necesitarás un objeto contenedor. La mayoría de las primitivas usan NSNumber, pero eso podría no ser aplicable a su estructura. Una envoltura no sería muy difícil de escribir, ¡aunque ese tipo de derrotas tiene el propósito de usar una estructura!
Editar: Esto es algo que no he hecho, solo he pensado. Si lo piensas, un NSDictionary es básicamente una estructura para objetos. Sus claves pueden ser los nombres de los componentes struct como NSStrings y sus valores pueden ser del tipo de datos correspondiente incluido en el contenedor Cocoa aplicable. Luego solo coloque estos diccionarios en un NSArray.
Supongo que la esencia es que tienes muchas opciones. Si fuera usted, haría algo de experimentación y vería qué funciona mejor.
Es más fácil usar la clase, pero ¿qué ocurre si necesita trabajar con C y estructuras objetivas como CGRect u otras? Intenté usar NSValue, pero funciona extraño ...
CGRect rect =CGRectMake(20,220,280,30);
NSValue* rectValue = [NSValue valueWithCGRect:rect];
NSArray *params1;
params1= [NSArray arrayWithObjects:rectValue,nil];
Pero, puedo obtener el valor de CGRect solo como:
CGRect cgr = [[params1 objectAtIndex:0] CGRectValue];
Cuando uso esto:
id currentVal = [params1 objectAtIndex:0];
void* buffer;
buffer=[currentVal pointerValue];
causa el error ...
problema resuelto aquí
Si desea utilizar un NSArray, deberá colocar sus estructuras en una caja. Puede usar la clase NSValue para codificarlos.
Algo como esto para codificar:
struct foo {
int bar;
};
struct foo foobar;
foobar.bar = 3;
NSValue *boxedFoobar = [NSValue valueWithBytes:&foobar objCType:@encode(struct foo)];
Y luego para volver a salir:
struct foo newFoobar;
if (strcmp([boxedFoobar objCType], @encode(struct foo)) == 0)
[boxedFoobar getValue:&newFoobar];
¿Necesita ser una estructura? En general, es mejor convertirlo en un objeto si puedes. Luego puede usar cosas como KVC y enlaces con ella.