7

我正在尝试使用NSRange来保存一系列年份,例如

NSRange years = NSMakeRange(2011, 5);

我知道NSRange主要用于过滤,但是我想循环遍历范围内的元素。NSRange如果不将其转换为,这可能NSArray吗?

4

4 回答 4

8

听起来您希望NSRange自己像一个 Pythonrange对象。它不是; NSRange只是一个结构

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

不是一个对象。一旦你创建了一个,你就可以在一个普通的旧for循环中使用它的成员:

NSUInteger year;
for(year = years.location; year < NSMaxRange(years); year++ ){
    // Do your thing.
}

(仍然假设您正在考虑使用 Python。)ObjC 中有一种称为快速枚举的语法,用于迭代 an 的内容,NSArray这与 Pythonfor循环非常相似,但由于不能将文字和原始数字放入an NSArray,您不能直接从 anNSRange转到 Cocoa 数组。

但是,类别可以使这更容易:

@implementation NSArray (WSSRangeArray)

+ (id)WSSArrayWithNumbersInRange:(NSRange)range
{
    NSMutableArray * arr = [NSMutableArray array];
    NSUInteger i;
    for( i = range.location; i < NSMaxRange(range); i++ ){
        [arr addObject:[NSNumber numberWithUnsignedInteger:i]];
    }

    return arr;
}

然后您可以创建一个数组并使用快速枚举:

NSArray * years = [NSArray WSSArrayWithNumbersInRange:NSMakeRange(2011, 5)];
for( NSNumber * yearNum in years ){
    NSUInteger year = [yearNum unsignedIntegerValue];
    // and so on...
}
于 2011-11-30T04:10:29.253 回答
6

请记住,NSRange 是一个包含两个整数的结构,表示范围的开始和长度。您可以使用 for 循环轻松循环所有包含的整数。

NSRange years = NSMakeRange(2011, 5);
NSUInteger year;
for(year = years.location; year < years.location + years.length; ++year) {
    // Use the year variable here
}
于 2011-11-30T04:09:01.967 回答
3

这是一个老问题,但使用 an 的替代方法NSArray是创建NSIndexSet具有所需范围(使用indexWithIndexesInRange:or initWithIndexesInRange:)然后使用块枚举,如https://stackoverflow.com/a/4209289/138772。(似乎相关,因为我自己只是在检查这个。)

于 2013-07-01T14:30:37.530 回答
0

我对此的替代解决方案是定义一个宏以使速记更快。

#define NSRangeEnumerate(i, range)    for(i = range.location; i < NSMaxRange(range); ++i)

要调用它,您可以:

NSArray *array = @[]; // must contain at least the following range...
NSRange range = NSMakeRange(2011, 5);
NSUInteger i;
NSRangeEnumerate(i, range) {
    id item = array[i];
    // do your thing
}

就个人而言,我仍在试图弄清楚如何编写宏,所以我可以这样称呼它:

NSRangeEnumerate(NSUInteger i, range) {

}

尚不支持...希望能帮助或使您更快地键入程序

于 2014-08-25T13:53:13.797 回答