2011-01-28 11 views
6

Mam klasę dziedziczącą po obiekcie NSObject. Używa obiektu NSMutableArray do przechowywania obiektów podrzędnych, np. Ludzie używający obiektów NSMutableArray * do przechowywania obiektów Person. Jak zaimplementować NSFastEnumerator na elementy?Implementacja wartości NSFastEnumeration w klasie niestandardowej

Próbowałem następujących ale to nieważne:

@interface People : NSObject <NSFastEnumeration> 
{ 
    NSMutableArray *items; 
} 

@implementation ...

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len 
{ 
    if(state->state == 0) 
    { 
     state->mutationsPtr = (unsigned long *)self; 
     state->itemsPtr = items; 
     state->state = [items count]; 
     return count; 
    } 
    else 
     return 0; 
} 
+0

Co to jest, że staramy się robić? Jeśli użyjesz tylko [array count], możesz już policzyć, jeśli chcesz uzyskać liczbę określonych typów obiektów w tablicy, której powinieneś użyć (obiekt id w tablicy) <= który jest szybkim wyliczeniem –

+0

Mam wystąpienie na mojej klasie Ludzie w delegacji mojej aplikacji, powiedzmy, że chcę to zrobić: dla (Osoba * p w Ludzie) { NSLog (p); } – user593733

Odpowiedz

18

Nie używasz poprawnie struktury NSFastEnumerationState. Zobacz NSFastEnumeration Protocol Reference i spójrz na sekcję stałych, aby zobaczyć opis każdego z pól. W twoim przypadku powinieneś zostawić state->mutationsPtr jako zero. state->itemsPtr należy ustawić na tablicę C obiektów, a nie na NSArray lub NSMutableArray. Musisz również umieścić te same obiekty w tablicy przekazanej jako stackbuf.

Jednakże, ponieważ używasz NSMutableArray zawierać obiekty, które są wyliczający, można po prostu przekazać połączenie do tego obiektu:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len { 
    return [items countByEnumeratingWithState:state objects:stackbuf count:len]; 
} 
+2

"tylko przekieruj połączenie do tego obiektu". Dlaczego nie pomyślałem o tym. Dzięki! – user593733

+0

Czy wartość * mutationsPtr nie zostanie zbuforowana przez osobę dzwoniącą? \t Byłoby bezpieczniej wypowiadać-> mutacjePtr = i stan-> dodatkowe [0]; jeśli nie ignoruje NULL. –

1

Jest protokołem NSFastEnumeration, ale używasz (nieistniejącą) NSFastEnumerator protokół . Czy to może być problem?

+0

Mam instancję na mojej klasie Ludzie w moim app delegate Powiedzmy, że chcę móc to zrobić: dla (Osoba * p w Ludzie) { NSLog (p); } – user593733

Powiązane problemy