7

Python 可以创建一个包含连续数字的列表,如下所示:

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

如何在 Objective-c 中实现这一点?

4

4 回答 4

11

阅读您的陈述“只需要一个带有连续数字的数组,我不想用循环初始化它”我问:对您来说更重要的是:拥有array或拥有代表连续范围的(自然)数字。看看它可能会接近你想要的。你用它初始化它NSIndexSet

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

迭代这个集合就像迭代一个数组一样简单,不需要 NSNumbers。

于 2012-08-03T11:51:47.013 回答
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];

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

于 2012-08-03T09:39:20.970 回答
4

您可以使用NSRange.

NSRange numbers = NSMakeRange(1, 10);

NSRange只是一个结构,不像Python范围对象。

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

所以你必须使用for循环来访问它的成员。

NSUInteger num;
for(num = 1; num <= maxValue; num++ ){
    // Do Something here
}
于 2012-08-03T09:48:28.087 回答
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];

如果你copyaRangeArray它将成为一个普通的NSNumber对象数组,但你可以通过实现NSCopying协议方法来避免。

于 2012-08-03T10:26:31.007 回答