NSArray сторонний подкласс для хранения примитивного значения - PullRequest
1 голос
/ 03 января 2012

Обновление: С новыми дополнениями (подписка и цифры) этот вопрос устарел.


Недавно я видел некоторый код для подкласса класса NSArray(или любой класс коллекции) для хранения примитивных значений.

Идея была в том, чтобы написать:

myArray = [NSArray arrayWithObject:[NSNumber numberWithInt:42]];
[[myArray objectAtIndex:0] intValue];

Вы могли бы написать:

myArray = [NSPrimitiveObjectArray arrayWithObject:42];
[myArray objectAtIndex:0];

Я больше не могу найти этот код.Видел ли бы кто-нибудь это и помнил бы URL?

Я также был бы признателен за отзывы людей, которые использовали его - или похожий код - и что они думают об этом.Причина, по которой я не сохранил ссылку при просмотре этого кода, заключалась в том, что у меня появилось чувство взлома языка, который может вызвать проблемы в долгосрочной перспективе.

1 Ответ

1 голос
/ 03 января 2012

Если бы я делал это, я бы просто написал категорию для NSArray и / или NSMutableArray. Примерно так:

@interface NSMutableArray (PrimitiveAccessors)

- (void)addInteger:(NSInteger)value;
- (NSInteger)integerAtIndex:(NSUInteger)index;
- (void)addFloat:(float)value;
- (float)floatAtIndex:(NSUInteger)index;

// etc...

@end

@implementation NSMutableArray (PrimitiveAccessors)

- (void)addInteger:(NSInteger)value;
{
    [self addObject:[NSNumber numberWithInteger:value]];
}

- (NSInteger)integerAtIndex:(NSUInteger)index;
{
    id obj = [self objectAtIndex:index];
    if (![obj respondsToSelector:@selector(integerValue)]) return 0;
    return [obj integerValue];
}

- (void)addFloat:(float)value;
{
    [self addObject:[NSNumber numberWithFloat:value]];
}

- (float)floatAtIndex:(NSUInteger)index;
{
    id obj = [self objectAtIndex:index];
    if (![obj respondsToSelector:@selector(floatValue)]) return 0;
    return [obj floatValue];
}

// etc...

@end

Правда, похоже, это больше работы, чем стоит. Заворачивать примитивы в NSNumber и вытаскивать их обратно не так уж и сложно ...

...