38 votes

Comment envelopper un Struct dans NSObject ?

C'est censé être trivial je pense, mais je n'arrive pas à trouver un moyen d'envelopper une variable Struct dans un fichier de type NSObject . Existe-t-il une méthode pour y parvenir ? Si ce n'est pas le cas, comment dois-je procéder pour ajouter un struct dans un fichier NSMutableArray ?

Merci.

79voto

Rpranata Points 827

Hm, essayez de regarder le NSValue à l'adresse https://developer.apple.com/documentation/foundation/nsvalue

Vous pouvez l'utiliser comme

struct aStruct
{
    int a;
    int b;
};
typedef struct aStruct aStruct;

Puis, en quelque sorte, l'envelopper dans une NSValue comme un objet :

aStruct struct; struct.a = 0; struct.b = 0;
NSValue *anObj = [NSValue value:&struct withObjCType:@encode(aStruct)];
NSArray *array = @[anObj];

Pour retirer la structure de NSValue utiliser :

NSValue *anObj = [array firstObject];
aStruct struct;
[anObj getValue:&struct];

Je suppose que plus tard, vous pourrez avoir une catégorie de NSValue pour rendre cela meilleur =D

13voto

nacho4d Points 12879

Quelque chose comme ceci serait la catégorie @Rpranata parle :)

struct _Pair
{
    short val;
    short count;
};
typedef struct _Pair Pair;

@interface NSValue (Pair)
+ (id)valueWithPair:(Pair)pair;
- (Pair)pairValue;
@end

@implementation NSValue (Pair)
+ (id)valueWithPair:(Pair)pair
{
    return [NSValue value:&pair withObjCType:@encode(Pair)];
}
- (Pair)pairValue
{
    Pair pair; [self getValue:&pair]; return pair;
}
@end

Utilisation :

// Boxing
Pair pair; pair.val = 2; pair.count = 1;
NSValue *value = [NSValue valueWithPair:pair];

// Unboxing
NSValue value = ...
Pair anotherPair = [value pairValue];

0voto

Kyle Robson Points 606

Utilisez + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;

Dans la documentation : "Crée un nouvel objet de valeur contenant la structure de transformation affine CoreGraphics spécifiée."

CGAffineTransform fooAffineTransform = CGAffineTransformMakeScale(.5, .5);
[NSValue valueWithCGAffineTransform:fooAffineTransform];

+valueWithCGAffineTransform existe depuis iOS 2.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X