web-dev-qa-db-fra.com

Comment envelopper une structure dans NSObject

c'est supposé être trivial… Je pense, mais je ne trouve pas le moyen d'envelopper une variable Struct dans un NSObject. Y a-t-il une méthode pour le faire? Sinon, comment pourrais-je ajouter une structure à une NSMutableArray?

Merci.

37
GeneCode

Hm, essayez de regarder la NSValue dans 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, "envelopper" dans un objet NSValue comme:

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

Pour extraire la structure de NSValue, utilisez:

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

Je suppose que plus tard, vous pouvez avoir une catégorie de NSValue pour améliorer cela = D

78
Rpranata

Quelque chose comme ça 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

Usage:

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

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

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

A partir de 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.

0
Kyle Robson