Objective C相当于PHP范围函数?

时间:2015-01-09 22:39:27

标签: objective-c

我想快速创建一个0到10000之间的数字数组,但步长增量为500,对于一个如下所示的数组:

@[@0, @500, @1000, ... @10000]
PHP中的

,内置于range函数,您可以按照以下方式生成:range(0, 10000, 500)

我不是真的在寻找像循环一些初始数组或数字超过0-10000并使用模数或其他东西的答案,我只想知道是否有内置函数或常用简写这样做

2 个答案:

答案 0 :(得分:3)

在Objective-C中没有类似的内置函数。正如您所暗示的,最好的方法是循环如下:

NSMutableArray *array = [[NSMutableArray alloc] init];
for (NSInteger i = 0; i <= 10000; i += 500) {
    [array addObject:@(i)];
}

如果您想创建一个与PHP range function类似的方法:返回从开始结束的元素数组,包括在内。

这样做:

+ (NSArray *)rangeWithStart:(NSInteger)start end:(NSInteger)end step:(NSInteger)step {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    for (NSInteger i = start; i <= end; i += step) {
        [array addObject:@(i)];
    }
    return [array copy];
}

答案 1 :(得分:2)

如果你想快速创建一个大型数组,或者想要一个范围的数组,那么你可以创建一个实际上并不存储所有值的数组,但可以根据需要随时计算它们。

要继承NSArray,您只需要实现两个方法countobjectAtIndex:,您的子类就是一个完整的数组。

这是一个实现,很简单,没有注释; - )

@interface RangeArray : NSArray

- (instancetype) initWithStart:(NSInteger)start end:(NSInteger)end step:(NSInteger)step;

@end

@implementation RangeArray
{
   NSInteger start, end, step;
   NSInteger count;
}

- (instancetype) initWithStart:(NSInteger)_start end:(NSInteger)_end step:(NSInteger)_step
{
   self = [super init];
   if (self)
   {
      start = _start;
      end = _end;
      step = _step;
      count = (end >= start && step > 0) || (end < start && step < 0) ? 1 + (end - start) / step : 0;
   }
   return self;
}

- (NSUInteger) count { return count; }

- (id) objectAtIndex:(NSUInteger)index { return @(start + step * index); }

@end

您可以使用以下方式生成所需范围:

RangeArray *range = [RangeArray.alloc initWithStart:0 end:10000 step:500];

HTH