Реализация NSFastEnumeration в пользовательском классе - PullRequest
6 голосов
/ 28 января 2011

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

Я пробовал следующее, но оно недействительно:

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

@ реализация ...

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

Ответы [ 2 ]

19 голосов
/ 28 января 2011

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

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

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len {
    return [items countByEnumeratingWithState:state objects:stackbuf count:len];
}
1 голос
/ 28 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...