2008-12-25 6 views

Répondre

44

Si vous souhaitez utiliser un NSArray dont vous aurez besoin à la boîte vos struct. Vous pouvez utiliser la classe NSValue pour les coder.

Quelque chose comme cela encode:

struct foo { 
    int bar; 
}; 

struct foo foobar; 
foobar.bar = 3; 
NSValue *boxedFoobar = [NSValue valueWithBytes:&foobar objCType:@encode(struct foo)]; 

Et puis pour le récupérer sur:

struct foo newFoobar; 

if (strcmp([boxedFoobar objCType], @encode(struct foo)) == 0) 
    [boxedFoobar getValue:&newFoobar]; 
+1

Une bonne suggestion, bien qu'il y ait une boxe de succès et unboxing. Ce n'est pas terrible, mais notable si vous avez besoin de la vitesse. –

11

Si vous êtes d'accord avec un réseau régulier vieux C:

struct foo{ 
    int bar; 
}; 

int main (int argc, const char * argv[]) { 
    struct foo foobar[3]; 
    foobar[0].bar = 7; 
} 

Si vous voulez un NSArray, vous aurez besoin d'un objet wrapper. La plupart des primitives utilisent NSNumber, mais cela peut ne pas s'appliquer à votre structure. Un wrapper ne serait pas très difficile à écrire, bien que ce genre de vaincre l'objectif d'utiliser une structure!

Edit: C'est quelque chose que je n'ai pas fait mais juste pensé. Si vous y pensez, un NSDictionary est essentiellement une structure pour les objets. Vos clés peuvent être les noms des composants de la structure en tant que NSStrings et vos valeurs peuvent être du type de données correspondant encapsulé dans l'encapsuleur Cocoa applicable. Ensuite, il suffit de mettre ces dictionnaires dans un NSArray. Je suppose que l'essentiel est que vous avez beaucoup d'options. Si j'étais vous, j'expérimenterais et verrais ce qui fonctionne le mieux.

20

ou allocation dynamique:

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); 
} 
2

-t-il besoin d'être un struct? Il est généralement préférable d'en faire un objet si vous le pouvez. Ensuite, vous pouvez utiliser des choses comme KVC et Bindings avec.

+0

Hey Peter, en ce moment je ne pense pas que j'ai besoin de ceux-ci, mais c'est un sujet qui m'intéresse. Je viens d'ouvrir une question spécifique: http://stackoverflow.com/questions/393662 –

0

Il est plus facile d'utiliser la classe, mais que se passe-t-il si vous avez besoin de travailler avec C et les structures de l'objectif c comme CGRect ou autres. J'ai essayé d'utiliser NSValue, mais il travaille étrange ...:

CGRect rect =CGRectMake(20,220,280,30); 
NSValue* rectValue = [NSValue valueWithCGRect:rect]; 
NSArray *params1; 
params1= [NSArray arrayWithObjects:rectValue,nil]; 

Mais, je peux obtenir la valeur CGRect seulement comme:

CGRect cgr = [[params1 objectAtIndex:0] CGRectValue]; 

Quand j'utilise ceci:

id currentVal = [params1 objectAtIndex:0]; 
void* buffer; 
buffer=[currentVal pointerValue]; 

provoque l'erreur ...


problème résolu

here

Questions connexes