2010-08-19 9 views
14

Soy nuevo en Objective-C, así que no me juzguen demasiado. Me preguntaba: ¿existe un equivalente del contenedor de pares C++ STL que pueda usar en Objective-C?Equivalente del contenedor C++ STL "par <T1, T2>" en Objective-C?

Quiero construir una matriz que contiene un NSInteger asociado a un NSBool. Sé que podría usar una matriz con cada entrada siendo un NSDictionary con una sola clave-valor, pero me parece un poco exagerado.

¿Alguna idea?

Gracias.

Respuesta

7

Puede usar el STL en Objective-C++. Todo lo que necesita hacer es cambiar la extensión de su archivo .m a .mm y también le aconsejo que use #import en lugar de #include. De esa forma puede usar su contenedor STL de par.

+1

Solo tenga en cuenta que los contenedores STL no "retienen" ni "liberan" objetos. – dreamlax

16

Usted puede escribir su propio objeto estructura de datos - para un caso tan simple, sería bastante fácil:

@interface Pair : NSObject 
{ 
    NSInteger integer; 
    BOOL  boolean; 
} 
@property (nonatomic, assign) integer; 
@property (nonatomic, assign) boolean; 
@end 

Y una aplicación coincidente, que se adhieren a sus Pair objetos en el NSArray sin problemas.

+4

@Martin, absolutamente cierto. Pero el OP parece indicar que quiere un par específico. Reemplazar las dos propiedades aquí con 'id' haría el trabajo. –

-1

Qué tal una categoría de Par en NSNumber que usa objetos asociados, algo como el siguiente código (no probado, puede requerir iOS4 ya que no estoy seguro de cuándo se introdujeron los objetos asociados).

#import <objc/runtime.h> 

@implementation NSNumber(Pair) 

#define PAIR_KEY 'p' 

- (NSNumber *) pairNumber:(NSNumber *)second 
{ 
    char secondKey = PAIR_KEY; 
    objc_setAssociatedObject(self, &secondKey, second, OBJC_ASSOCIATION_RETAIN); 
    return self; 
} 

- (NSNumber *) pairedNumber 
{ 
    char secondKey = PAIR_KEY; 
    NSNumber *associatedObject = (NSNumber *)objc_getAssociatedObject(self, &secondKey);  
    return associatedObject; 
} 

@end 

Se podría usarlo de esta manera:

BOOL myBool = NO; 

NSNumber *storedBool = [NSNumber numberWithBool:myBool]; 

[myOtherNumber pairNumber:storedBool]; 

Y para sacarlo:

NSNumber *boolNumber = [myOtherNumber pairedNumber]; 
1

Usando literales struct y struct anónimos, que podría ser capaz de hacer algo como

NSValue * v = [NSValue valueWithBytes:(struct {NSInteger i; bool b;}){i,b} objCType:(struct {NSInteger i; bool b;})]; 

y luego t o lea,

struct {NSInteger i; bool b;} foo; 
[v getValue:&foo]; 

Sin embargo, es un poco más limpio si nombra su estructura.

Cuestiones relacionadas