Python可以生成如下连续数字的列表:
numbers=range(1,10); // >> [1,2,3,4,5,6,7,8,9]
如何在Objective-C中实现这个功能?
Python可以生成如下连续数字的列表:
numbers=range(1,10); // >> [1,2,3,4,5,6,7,8,9]
阅读您的陈述“只需要一个连续数字的数组,我不想用循环初始化它”让我问:对您来说更重要的是拥有一个数组
还是拥有一个表示连续自然数范围的“某些东西”。看一下NSIndexSet
,它可能接近您想要的内容。您可以使用它进行初始化。
[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1,9)];
遍历这个集合就像遍历一个数组一样简单,并不需要使用 NSNumbers。
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];
如果您想更频繁地使用它,可以选择将其放在一个类别中。
NSArray
的一个类别中呢?方法的签名可以像这样:-(NSArray*)arrayWithRangeFrom:(int)start to:(int)stop step:(int)step;
- JeremyPNSRange
。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
}
您需要一个适当的初始化方法,该方法调用[super init]
;并且
您需要重写count
和objectAtIndex:
您可以做更多的事情,但不需要。这是一个草图,缺少一些检查代码:
@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
协议方法来解决。