我正在尝试使用NSRange
来保存一系列年份,例如
NSRange years = NSMakeRange(2011, 5);
我知道NSRange
主要用于过滤,但是我想循环遍历范围中的元素。是否可以在不将NSRange
转换为NSArray
的情况下实现
发布于 2011-11-30 12:10:29
这听起来有点像你期望NSRange
像一个Python range
对象。它不是;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中有一种称为fast enumeration的语法,用于迭代NSArray
的内容,类似于Python for
循环,但由于文字和原始数字不能放入NSArray
中,因此不能直接从NSRange
转到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-30 12:09:02
请记住,NSRange是一个包含两个整数的结构,表示范围的起始和长度。您可以使用for循环轻松地遍历所有包含的整数。
NSRange years = NSMakeRange(2011, 5);
NSUInteger year;
for(year = years.location; year < years.location + years.length; ++year) {
// Use the year variable here
}
发布于 2013-07-01 22:30:38
这是一个有点老的问题,但是使用NSArray
的另一种选择是创建一个具有所需范围的NSIndexSet
(使用indexWithIndexesInRange:
或initWithIndexesInRange:
),然后使用块枚举,就像在https://stackoverflow.com/a/4209289/138772中一样。(看起来很相关,因为我自己也在检查这个。)
https://stackoverflow.com/questions/8320987
复制相似问题