2011-11-30 36 views
6

Tôi đang cố gắng sử dụng NSRange tổ chức một loạt các năm, chẳng hạn nhưLooping sử dụng NSRange

NSRange years = NSMakeRange(2011, 5); 

Tôi biết NSRange được sử dụng chủ yếu cho việc lọc, tuy nhiên tôi muốn lặp qua các yếu tố trong phạm vi. Điều đó có thể thực hiện được nếu không chuyển đổi NSRange thành một NSArray?

Trả lời

8

Loại âm thanh như bạn đang mong đợi NSRange giống như một đối tượng Python range. Nó không phải; NSRange chỉ đơn giản là cấu trúc

typedef struct _NSRange { 
     NSUInteger location; 
     NSUInteger length; 
} NSRange; 

không phải là đối tượng. Khi bạn đã tạo, bạn có thể sử dụng các thành viên của nó trong một đồng bằng cũ for loop:

NSUInteger year; 
for(year = years.location; year < NSMaxRange(years); year++){ 
    // Do your thing. 
} 

(Vẫn làm việc trên giả định rằng bạn đang nghĩ về Python.) Có cú pháp trong ObjC gọi fast enumeration cho iterating trên nội dung của một số NSArray tương tự như một vòng lặp Python for, nhưng vì các số nguyên và số nguyên không thể được đưa vào một số NSArray, bạn không thể truy cập trực tiếp từ một số NSRange tới mảng Cocoa.

Một loại có thể làm điều đó dễ dàng hơn, mặc dù:

@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; 
} 

Sau đó, bạn có thể tạo một mảng và sử dụng liệt kê nhanh:

NSArray * years = [NSArray WSSArrayWithNumbersInRange:NSMakeRange(2011, 5)]; 
for(NSNumber * yearNum in years){ 
    NSUInteger year = [yearNum unsignedIntegerValue]; 
    // and so on... 
} 
+0

cảm ơn, quá xấu không có hỗ trợ cho việc liệt kê nhanh NSRange. có thể giúp tôi tiết kiệm thời gian và các dòng mã – aporat

+0

@manroe: Tôi đánh giá cao sự chỉnh sửa lỗi mã hóa của bạn, nhưng khối "EDIT:" lớn không phù hợp; nó có thể là một nhận xét, bản tóm tắt chỉnh sửa, hoặc thực sự chỉ bị loại bỏ hoàn toàn. –

6

Hãy nhớ rằng NSRange là một cấu trúc chứa hai số nguyên, biểu thị độ dài và độ dài của dải ô. Bạn có thể dễ dàng lặp qua tất cả các số nguyên chứa một vòng lặp for.

NSRange years = NSMakeRange(2011, 5); 
NSUInteger year; 
for(year = years.location; year < years.location + years.length; ++year) { 
    // Use the year variable here 
} 
3

Đây là một chút của một câu hỏi cũ, nhưng một sự thay thế sử dụng NSArray sẽ tạo một NSIndexSet với phạm vi mong muốn (sử dụng indexWithIndexesInRange: hoặc initWithIndexesInRange:) và sau đó sử dụng điều tra khối như trong https://stackoverflow.com/a/4209289/138772. (Dường như có liên quan vì tôi chỉ tự mình kiểm tra điều này.)

0

Giải pháp thay thế của tôi cho điều này, là xác định macro chỉ để viết nhanh hơn.

#define NSRangeEnumerate(i, range) for(i = range.location; i < NSMaxRange(range); ++i) 

Để gọi nó là bạn:

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 
} 

Cá nhân tôi vẫn đang cố gắng tìm hiểu làm thế nào tôi có thể viết vĩ mô vì vậy tôi chỉ có thể gọi nó thích:

NSRangeEnumerate(NSUInteger i, range) { 

} 

mà chưa được hỗ trợ ... hy vọng sẽ giúp hoặc làm cho việc nhập chương trình của bạn nhanh hơn