我想快速创建一个0到10000之间的数字数组,但步长增量为500,对于一个如下所示的数组:
@[@0, @500, @1000, ... @10000]
PHP
中的,内置于range函数,您可以按照以下方式生成:range(0, 10000, 500)
我不是真的在寻找像循环一些初始数组或数字超过0-10000并使用模数或其他东西的答案,我只想知道是否有内置函数或常用简写这样做
答案 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
,您只需要实现两个方法count
和objectAtIndex:
,您的子类就是一个完整的数组。
这是一个实现,很简单,没有注释; - )
@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