我正在尝试使用NSRange
来保存一系列年份,例如
NSRange years = NSMakeRange(2011, 5);
我知道NSRange
主要用于过滤,但是我想循环遍历范围内的元素。NSRange
如果不将其转换为,这可能NSArray
吗?
我正在尝试使用NSRange
来保存一系列年份,例如
NSRange years = NSMakeRange(2011, 5);
我知道NSRange
主要用于过滤,但是我想循环遍历范围内的元素。NSRange
如果不将其转换为,这可能NSArray
吗?
听起来您希望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...
}
请记住,NSRange 是一个包含两个整数的结构,表示范围的开始和长度。您可以使用 for 循环轻松循环所有包含的整数。
NSRange years = NSMakeRange(2011, 5);
NSUInteger year;
for(year = years.location; year < years.location + years.length; ++year) {
// Use the year variable here
}
这是一个老问题,但使用 an 的替代方法NSArray
是创建NSIndexSet
具有所需范围(使用indexWithIndexesInRange:
or initWithIndexesInRange:
)然后使用块枚举,如https://stackoverflow.com/a/4209289/138772。(似乎相关,因为我自己只是在检查这个。)
我对此的替代解决方案是定义一个宏以使速记更快。
#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) {
}
尚不支持...希望能帮助或使您更快地键入程序