как преобразовать диапазон в NSArray в Objective-C - PullRequest
4 голосов
/ 25 февраля 2012

Я знаю, как это сделать в Ruby, преобразовывая диапазон чисел в массив. Но как это возможно в Objective-C?

Ruby: (1..100).to_a

Ответы [ 4 ]

8 голосов
/ 25 февраля 2012

Вы должны сделать это вручную:

// Assuming you've got a "NSRange range;"
NSMutableArray *array = [NSMutableArray array];
for (NSUInteger i = range.location; i < range.location + range.length; i++) {
    [array addObject:[NSNumber numberWithUnsignedInteger:i]];
}
4 голосов
/ 07 мая 2013

Вместо этого вы можете попробовать NSIndexSet.

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 100)];
4 голосов
/ 25 февраля 2012

Просто бросить дурацкое решение слева:

Идея состоит в том, чтобы механизм кодирования значения ключа создал для вас массив с помощью индексированных свойств.

Интерфейс:

@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 выше.

1 голос
/ 25 февраля 2012

Вам нужно написать простой цикл. В Objective-C нет оператора "диапазона чисел".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...