2011-11-30 9 views
6

Próbuję użyć NSRange posiadać szereg lat, takich jakpętli przy użyciu NSRange

NSRange years = NSMakeRange(2011, 5); 

wiem NSRange służy głównie do filtrowania, jednak chcę pętli nad elementami w tym zakresie. Czy jest to możliwe bez konwersji NSRange na ?

Odpowiedz

8

To niby brzmi jak czekasz NSRange być jak Python range obiektu. To nie jest; NSRange jest po prostu strukturą, a nie obiektem. Po utworzeniu jednego, można użyć jej członków w zwykły stary for pętli:

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

(Nadal działa na założeniu, że myślisz o Pythonie.) Jest składni w ObjC nazywa fast enumeration dla iteracji nad zawartość NSArray, która jest przyjemnie podobna do pętli Python for, ale ponieważ liczby literalne i pierwotne nie mogą być wstawione do NSArray, nie można przejść bezpośrednio z tablicy NSRange do tablicy kakao.

A Kategoria mógłby zrobić to łatwiej, choć:

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

Następnie można utworzyć tablicę i wykorzystywać szybki liczby:

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

dzięki, szkoda, że ​​nie ma wsparcia dla szybkiego wyliczenia dla NSRange. może zaoszczędzić mi trochę czasu i linii kodu – aporat

+0

@manroe: Doceniam twoją korektę mojego błędu kodowania, ale duży blok "EDIT:" był niewłaściwy; mógł to być komentarz, podsumowanie edycji lub w ogóle pominięty. –

6

Pamiętaj, że NSRange jest strukturą zawierającą dwie liczby całkowite, reprezentującą początek i długość zakresu. Możesz łatwo zapętlić wszystkie zawarte liczby całkowite za pomocą pętli for.

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

To jest trochę starej pytanie, ale alternatywą użycie NSArray może stworzyć NSIndexSet z żądanym zakresem (używając indexWithIndexesInRange: lub initWithIndexesInRange:), a następnie używając wyliczenia bloku jak w https://stackoverflow.com/a/4209289/138772. (Wydawało się to istotne, ponieważ sam sprawdzałem).

0

Moim alternatywnym rozwiązaniem było zdefiniowanie makra tylko po to, aby szybciej i szybciej nad nim pracować.

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

nazwać to zrobić:

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 
} 

osobiście jestem nadal próbuje dowiedzieć się, jak mogę napisać makro, więc mogę tylko nazwać to lubią:

NSRangeEnumerate(NSUInteger i, range) { 

} 

który nie jest jeszcze wspierany ... mam nadzieję, że pomaga lub sprawia, że ​​wpisywanie twojego programu jest szybsze

Powiązane problemy