我正在尝试使用NSRange来保持一定年限,例如
NSRange years = NSMakeRange(2011,5);
我知道NSRange主要用于过滤,但我想循环遍历范围内的元素.如果没有将NSRange转换为NSArray,这可能吗?
解决方法
听起来有点像你期望NSRange像Python范围对象.不是;
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... }