Просто бросить дурацкое решение слева:
Идея состоит в том, чтобы механизм кодирования значения ключа создал для вас массив с помощью индексированных свойств.
Интерфейс:
@interface RangeArrayFactory : NSObject {
NSRange range;
}
@end
Реализация:
- (id)initWithRange: (NSRange)aRange
{
self = [super init];
if (self) {
range = aRange;
}
return self;
}
// KVC for a synthetic array
- (NSUInteger) countOfArray
{
return range.length;
}
- (id) objectInArrayAtIndex: (NSUInteger) index
{
return [NSNumber numberWithInteger:range.location + index];
}
Использование:
NSRange range = NSMakeRange(5, 10);
NSArray *syntheticArray = [[[RangeArrayFactory alloc] initWithRange: range] valueForKey: @"array"];
Это решение в основном для развлечения, но оно может иметь смысл для больших диапазонов, где реальный массив, заполненный последовательными числами, будет занимать больше памяти, чем фактически необходимо.
Как отметил Роб Нейпир в комментариях, вы также можете создать подкласс NSArray
, который просто требует от вас реализации count
и objectForIndex:
, используя тот же код, что и countOfArray
и objectInArrayAtIndex
выше.