如何将结构体封装到NSObject中

41

我认为这是一个很简单的问题,但我不知道如何将一个结构体变量包装成 NSObject。是否有一种方法可以这样做?如果没有,我该如何将结构体添加到 NSMutableArray 中呢?

谢谢。


1
可能是[如何将C结构体放入NSArray最佳方式?]的重复内容(链接: https://dev59.com/QG855IYBdhLWcg3wIAoa)。 - user557219
3个回答

85

嗯,尝试查看位于https://developer.apple.com/documentation/foundation/nsvalueNSValue

您可以像这样使用它

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

然后将其“包装”到一个 NSValue 对象中,如下所示:

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

要从NSValue中提取结构体,请使用:

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

我想以后你可以从NSValue创建一个类别来使它更好 =D


13

像这样的内容将是类别,@Rpranata所说的就是这个 :)

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

用法:

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

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

0

使用 + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;

从文档中可以得知:"创建一个包含指定的 CoreGraphics 仿射变换结构的新值对象。"

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

+valueWithCGAffineTransform自iOS 2.0以来就存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接