Objective-C数组中的连续数字,类似于Python中的range()函数

7

Python可以生成如下连续数字的列表:

numbers=range(1,10); // >> [1,2,3,4,5,6,7,8,9]

如何在Objective-C中实现这个功能?

你需要这个范围有什么目的? - holex
@holex 只需要一个连续数字的数组,我不想用循环来初始化它。 - Mil0R3
如果没有更多的信息,很难确定哪种解决方案最适合您。通用的解决方案是使用循环初始化一个数组,您可以将该数组用于所有情况,但对于特殊情况可能会有其他更优雅的技巧,但我们不知道您的最终目标是什么。 - holex
4个回答

11

阅读您的陈述“只需要一个连续数字的数组,我不想用循环初始化它”让我问:对您来说更重要的是拥有一个数组还是拥有一个表示连续自然数范围的“某些东西”。看一下NSIndexSet,它可能接近您想要的内容。您可以使用它进行初始化。

[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1,9)]; 

遍历这个集合就像遍历一个数组一样简单,并不需要使用 NSNumbers。


6

Objective-C(或实际上是Foundation)没有专门的功能来实现此操作。您可以使用以下方法:

NSMutableArray *array = [NSMutableArray array];
for(int i=1; i<10; i++) {
    [array addObject:@(i)]; // @() is the modern objective-c syntax, to box the value into an NSNumber.
}
// If you need an immutable array, add NSArray *immutableArray = [array copy];

如果您想更频繁地使用它,可以选择将其放在一个类别中。


是的,我也用过这种方法,我只是想找到一个更简单的方式。 - Mil0R3
正如我在编辑中提到的,如果您经常使用它,您可以创建一个类别(答案中的链接),使您可以执行以下操作:[NSArray arrayWithNumbersFrom:1 to:10]; - Patrick Pijnappel
@Veelian 为什么不将上面的代码封装成一个方法,然后将其放在 NSArray 的一个类别中呢?方法的签名可以像这样:-(NSArray*)arrayWithRangeFrom:(int)start to:(int)stop step:(int)step; - JeremyP

4
您可以使用NSRange
NSRange numbers = NSMakeRange(1, 10);

NSRange仅仅是一个结构体,与Python的range对象不同。

typedef struct _NSRange {
       NSUInteger location;
       NSUInteger length;
} NSRange;

因此,您必须使用for循环来访问其成员。

NSUInteger num;
for(num = 1; num <= maxValue; num++ ){
    // Do Something here
}

1
您可以使用用于范围的类来进行NSArray的子类化。子类化NSArray非常简单:
  • 您需要一个适当的初始化方法,该方法调用[super init];并且

  • 您需要重写countobjectAtIndex:

您可以做更多的事情,但不需要。这是一个草图,缺少一些检查代码:

@interface RangeArray : NSArray

- (id) initWithRangeFrom:(NSInteger)firstValue to:(NSInteger)lastValue;

@end

@implementation RangeArray
{
    NSInteger start, count;
}

- (id) initWithRangeFrom:(NSInteger)firstValue to:(NSInteger)lastValue
{
    // should check firstValue < lastValue and take appropriate action if not
    if((self = [super init]))
    {
        start = firstValue;
        count = lastValue - firstValue + 1;
    }
    return self;
}

// to subclass NSArray only need to override count & objectAtIndex:

- (NSUInteger) count
{
    return count;
}

- (id)objectAtIndex:(NSUInteger)index
{
    if (index >= count)
        @throw [NSException exceptionWithName:NSRangeException reason:@"Index out of bounds" userInfo:nil];
    else
        return [NSNumber numberWithInteger:(start + index)];
}

@end

您可以按照以下方式使用此功能:
NSArray *myRange = [[RangeArray alloc] initWithRangeFrom:1 to:10];

如果您复制一个RangeArray,它将变成一个普通的NSNumber对象数组,但是如果您希望避免这种情况,可以通过实现NSCopying协议方法来解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接