2011-01-28 1 views
6

У меня есть класс, который наследуется от NSObject. Он использует NSMutableArray для хранения дочерних объектов, например. Люди, использующие элементы NSMutableArray * для хранения объектов Person. Как реализовать NSFastEnumerator на элементах?Реализация NSFastEnumeration в пользовательском классе

Я попытался следующие, но он является недействительным:

@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

Что это, что вы пытаетесь сделать? Если вы просто используете [подсчет массива], вы можете получить счет уже, если вы хотите получить количество определенных типов объектов в массиве, которые вы должны использовать для (id-объекта в массиве) <=, который является быстрым перечислением –

+0

У меня есть экземпляр на моем классе «Люди» в моем делете приложения, скажем, я хочу, чтобы это было возможно: для (Person * p in People) { NSLog (p); } – user593733

ответ

18

Вы не используете структуру NSFastEnumerationState правильно. См. NSFastEnumeration Protocol Reference и посмотрите раздел констант, чтобы увидеть описание каждого из полей. В вашем случае вы должны оставить state->mutationsPtr как ноль. state->itemsPtr должен быть установлен в C-массив объектов, а не NSArray или NSMutableArray. Вам также нужно поместить те же объекты в массив, который передается как stackbuf.

Однако, так как вы используете NSMutableArray содержать объекты, которые вы перечисляете, вы могли бы просто передать вызов к этому объекту:

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

'просто переадресуйте вызов этому объекту' Теперь почему я не подумал об этом. Благодаря! – user593733

+0

Не будет ли кеширование значения * mutationsPtr вызывающим? \t Было бы безопаснее state-> mutationsPtr = & state-> extra [0]; если он не игнорирует NULL. –

1

Там в NSFastEnumeration протокол, но вы используете (несуществующий) NSFastEnumerator протокол , Может ли это быть проблема?

+0

У меня есть экземпляр класса my People в моем делегате приложения, скажем, я хочу, чтобы это было возможно: для (Person * p in People) { NSLog (p); } – user593733

Смежные вопросы