2010-08-19 7 views
14

Jestem nowy w Objective-C, więc proszę nie osądzaj mnie za bardzo. Zastanawiam się: czy istnieje odpowiednik kontenera pary C++ STL, którego mogę użyć w Objective-C?Odpowiednik kontenera C++ STL "para <T1, T2>" w Objective-C?

Chcę zbudować tablicę zawierającą NSInteger skojarzony z NSBool. Wiem, że mógłbym użyć tablicy, gdzie każdy wpis jest NSDictionary z jedną kluczową wartością, ale uważam, że jest to trochę przesadzone.

Wszelkie pomysły?

Dzięki.

Odpowiedz

7

Możesz używać STL w Objective-C++. Wszystko, co musisz zrobić, to zmienić rozszerzenie pliku .m na .mm i ja też radzę użyć #import zamiast #include. W ten sposób możesz użyć swojego kontenera STL.

+1

Należy pamiętać, że kontenery STL nie zawierają obiektów "zachowaj" i "zwolnij". – dreamlax

16

Można napisać swój własny obiekt struktury danych - do takiego prostego przypadku, byłoby to dość proste:

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

I realizacja dopasowanie, a następnie trzymać swoje Pair przedmiotów do NSArray bezproblemowe.

+4

@Martin, absolutnie prawdziwe. Ale OP wydaje się wskazywać, że chce określonej pary. Zastąpienie tutaj dwóch właściwości 'id' spowoduje wykonanie zadania. –

-1

Co powiedzie się na kategorię Pair w NSNumber, która używa powiązanych obiektów, coś jak poniższy kod (untested, może wymagać iOS4, ponieważ nie jestem pewien, kiedy wprowadzono skojarzone obiekty).

#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 

będzie go używać tak:

BOOL myBool = NO; 

NSNumber *storedBool = [NSNumber numberWithBool:myBool]; 

[myOtherNumber pairNumber:storedBool]; 

i aby go:

NSNumber *boolNumber = [myOtherNumber pairedNumber]; 
1

Korzystanie anonimowe struct i struct literały, może być w stanie zrobić coś takiego

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

, a następnie t o przeczytać,

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

To trochę bardziej przejrzyste, jeśli nazwiesz strukturę.