2011-11-30 15 views
6

我試圖用NSRange舉辦年份範圍,如使用NSRange

NSRange years = NSMakeRange(2011, 5); 

我知道NSRange大多用於過濾循環,但是我要循環範圍的元素。如果不將NSRange轉換爲NSArray,那麼可能嗎?

回答

8

它種聽起來像你期望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 enumerationNSArray的內容與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... 
} 
+0

謝謝,太糟糕了,不支持快速枚舉NSRange。可以節省我一些時間和代碼行 – aporat

+0

@manroe:我感謝您糾正我的編碼錯誤,但大的「編輯:」塊是不合適的;它可能是一條評論,編輯總結,或者完全忽略。 –

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 
} 
3

這是一個有點老問題,但替代使用NSArray將創建具有所需範圍的NSIndexSet(使用indexWithIndexesInRange:initWithIndexesInRange:),然後使用https://stackoverflow.com/a/4209289/138772中的塊枚舉。 (看起來相關,因爲我只是在自己檢查一下。)

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) { 

} 

這目前還不支持...希望能夠幫助或使您的程序更快打字