41

this is supposed to be trivial… I think, but I can't find a way how to wrap a Struct variable into an NSObject. Is there a method to do so? If not, how would I go about adding a struct into an NSMutableArray?

Thanks.

Wayne Chen
  • 305
  • 2
  • 15
GeneCode
  • 7,545
  • 8
  • 50
  • 85
  • 1
    possible duplicate of [What's the best way to put a c-struct in an NSArray?](http://stackoverflow.com/questions/4516991/whats-the-best-way-to-put-a-c-struct-in-an-nsarray) –  Apr 17 '11 at 06:17

3 Answers3

85

Hm, try to look at the NSValue at https://developer.apple.com/documentation/foundation/nsvalue

You can use it like

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

Then sort of "wrap" it to an NSValue object like:

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

To pull the struct out from NSValue use:

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

I guess later on, you can have a category from NSValue to make that better =D

Cœur
  • 37,241
  • 25
  • 195
  • 267
Rpranata
  • 2,010
  • 18
  • 24
13

Something like like this would be the category @Rpranata is talking about :)

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];
Community
  • 1
  • 1
nacho4d
  • 43,720
  • 45
  • 157
  • 240
0

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

From the docs: "Creates a new value object containing the specified CoreGraphics affine transform structure."

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

+valueWithCGAffineTransform has existed since iOS 2.0.

Kyle Robson
  • 3,060
  • 24
  • 20