2011-04-17 22 views
34

se supone que es trivial ... Creo, pero no puedo encontrar la forma de ajustar una variable de Struct en NSObject. ¿Hay algún método para hacerlo? Si no, ¿cómo voy a agregar una estructura en un NSMutableArray?Cómo envolver un Struct en NSObject

Gracias.

+1

posible duplicado de [¿Cuál es la mejor manera de poner un c-struct en un NSArray?] (Http://stackoverflow.com/questions/4516991/whats-the-best-way-to-put-ac-struct -in-an-nsarray) –

Respuesta

73

Hm, intenta mirar el NSValue en https://developer.apple.com/documentation/foundation/nsvalue

Se puede utilizar como

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

Entonces especie de "envolver" a un objeto NSValue como:

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

Para extraer la estructura del NSValue use:

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

supongo que más adelante, puede tener una categoría de NSValue para hacer que una mejor = D

+0

¿Hay alguna versión rápida para este código? –

12

Algo así como esto sería la categoría @Rpranata está hablando :)

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 

Uso:

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

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

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

De los documentos: "Crea un nuevo objeto de valor que contiene la estructura de transformación afín CoreGraphics especificada".

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

+ valueWithCGAffineTransform existe desde iOS 2.0.

Cuestiones relacionadas