我試圖用NSRange
舉辦年份範圍,如使用NSRange
NSRange years = NSMakeRange(2011, 5);
我知道NSRange
大多用於過濾循環,但是我要循環範圍的元素。如果不將NSRange
轉換爲NSArray
,那麼可能嗎?
我試圖用NSRange
舉辦年份範圍,如使用NSRange
NSRange years = NSMakeRange(2011, 5);
我知道NSRange
大多用於過濾循環,但是我要循環範圍的元素。如果不將NSRange
轉換爲NSArray
,那麼可能嗎?
它種聽起來像你期望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...
}
請記住,NSRange是一個包含兩個整數的結構,表示範圍的開始和長度。您可以使用for循環輕鬆遍歷所有包含的整數。
NSRange years = NSMakeRange(2011, 5);
NSUInteger year;
for(year = years.location; year < years.location + years.length; ++year) {
// Use the year variable here
}
這是一個有點老問題,但替代使用NSArray
將創建具有所需範圍的NSIndexSet
(使用indexWithIndexesInRange:
或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) {
}
這目前還不支持...希望能夠幫助或使您的程序更快打字
謝謝,太糟糕了,不支持快速枚舉NSRange。可以節省我一些時間和代碼行 – aporat
@manroe:我感謝您糾正我的編碼錯誤,但大的「編輯:」塊是不合適的;它可能是一條評論,編輯總結,或者完全忽略。 –