如何在Objective-C中将范围转换为NSArray

时间:2012-02-25 15:59:45

标签: objective-c cocoa

我知道如何在Ruby中执行此操作,将一系列数字转换为数组。但是如何在Objective-C中实现呢?

红宝石: (1..100).to_a

4 个答案:

答案 0 :(得分:8)

你必须手动完成:

// Assuming you've got a "NSRange range;"
NSMutableArray *array = [NSMutableArray array];
for (NSUInteger i = range.location; i < range.location + range.length; i++) {
    [array addObject:[NSNumber numberWithUnsignedInteger:i]];
}

答案 1 :(得分:4)

从左边开始抛出一个糟糕的解决方案:

我们的想法是让键值编码机制通过索引属性为您创建数组。

接口:

@interface RangeArrayFactory : NSObject {
    NSRange range;
}
@end

实现:

- (id)initWithRange: (NSRange)aRange
{
    self = [super init];
    if (self) {
        range = aRange;
    }
    return self;
}

// KVC for a synthetic array

- (NSUInteger) countOfArray
{
    return range.length;
}


- (id) objectInArrayAtIndex: (NSUInteger) index
{    
    return [NSNumber numberWithInteger:range.location + index];
}

使用:

NSRange range = NSMakeRange(5, 10);

NSArray *syntheticArray = [[[RangeArrayFactory alloc] initWithRange: range] valueForKey: @"array"];

这个解决方案主要是为了好玩,但可能对大范围有意义,其中填充连续数字的真实数组将占用比实际需要更多的内存。

正如Rob Napier在评论中所指出的那样,你也可以继承NSArray,只需要你实现countobjectForIndex:,使用与countOfArray相同的代码和objectInArrayAtIndex以上。

答案 2 :(得分:4)

您可能想尝试NSIndexSet

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 100)];

答案 3 :(得分:1)

你需要编写一个简单的循环。 Objective-C中没有任何“数字范围”运算符。