Эквивалент контейнера STL С++ "пара <T1, T2>" в Objective-C?
Я новичок в Objective-C, поэтому, пожалуйста, не судите меня слишком сильно. Мне было интересно: есть ли эквивалент контейнера пары STL С++, который я могу использовать в Objective-C?
Я хочу создать массив, содержащий NSInteger, связанный с NSBool. Я знаю, что могу использовать массив с каждой записью, являющейся NSDictionary с одним ключевым значением, но я нахожу, что это немного перебор.
Любые идеи?
Спасибо.
Ответы
Ответ 1
Вы можете использовать STL в Objective-C ++. Все, что вам нужно сделать, это изменить расширение вашего .m файла на .mm, и я также советую использовать #import
вместо #include
. Таким образом, вы можете использовать свой контейнер STL для пары.
Ответ 2
Вы можете написать свой собственный объект структуры данных - для такого простого случая было бы довольно легко:
@interface Pair : NSObject
{
NSInteger integer;
BOOL boolean;
}
@property (nonatomic, assign) integer;
@property (nonatomic, assign) boolean;
@end
И соответствующая реализация, тогда вы вставляете свои объекты Pair
в проблему NSArray
бесплатно.
Ответ 3
Используя анонимные строковые и структурные литералы, вы можете сделать что-то вроде
NSValue * v = [NSValue valueWithBytes:(struct {NSInteger i; bool b;}){i,b} objCType:(struct {NSInteger i; bool b;})];
а затем читать,
struct {NSInteger i; bool b;} foo;
[v getValue:&foo];
Немного чище, если вы назовете свою структуру.
Ответ 4
Как насчет категории пар в NSNumber, которая использует связанные объекты, что-то вроде кода ниже (непроверенный, может потребоваться iOS4, поскольку я не уверен, когда были связаны связанные объекты).
#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
Вы бы использовали его так:
BOOL myBool = NO;
NSNumber *storedBool = [NSNumber numberWithBool:myBool];
[myOtherNumber pairNumber:storedBool];
И чтобы узнать:
NSNumber *boolNumber = [myOtherNumber pairedNumber];