Подтвердить что ты не робот

Итерация над перечислением в Objective C?

У меня

enum Colour {
    white,
    pink,
    yellow,
    blue
} Colour;

и я хотел бы сделать что-то вроде этого:

for (int colour in Colour){
    // Do something here.
}

Могу ли я сделать это, и если да, то как? Спасибо за вашу помощь!

4b9b3361

Ответ 1

перечисление происходит от C, в то время как быстрое перечисление было добавлением Objective-C 2.0.. они не работают вместе.

Type existingItem;
for ( existingItem in expression ) { statements }

выражение должно соответствовать протоколу NSFastEnumeration и быть объектом! "элементы" перечисления не являются объектами.

см. эту ссылку для получения дополнительной информации Apple Fast Enumeration Documents

проверьте этот пример, чтобы узнать, как работает быстрое перечисление:

NSArray *array = [NSArray arrayWithObjects:
        @"One", @"Two", @"Three", @"Four", nil];

for (NSString *element in array) {
    NSLog(@"element: %@", element);
}

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
    @"quattuor", @"four", @"quinque", @"five", @"sex", @"six", nil];

NSString *key;
for (key in dictionary) {
    NSLog(@"English: %@, Latin: %@", key, [dictionary objectForKey:key]);
}

Ответ 2

Хотя вопрос уже дан, вот мои два цента:

enum Colour {
    white = 0,
    pink,
    yellow,
    blue,

    colorsCount // since we count from 0, this number will be blue+1 and will be actual 'colors count'
} Colour;

for (int i = 0; i < colorsCount; ++i)
  someFunc((Colour)i);

Я думаю, это не так уж плохо и довольно близко к быстрому перечислению, которое вы хотите.

Ответ 3

Элемент "Count" в перечислении хорош, но он заставит вас "не все случаи переключения обрабатываться" в инструкции switch, если вы не обработаете этот элемент "count" в нем. Может быть, немного лучше использовать псевдонимы для первого и для последних элементов:

enum Colour {
    firstColour = 0,

    white = firstColour,
    pink,
    yellow,
    blue,

    lastColour = blue
} Colour;

for (int i = firstColour; i <= lastColour; ++i) {

}

Ответ 4

Я пришел к этому сообщению, чтобы ответить на этот вопрос. Ответ Гобры велик. Но мое количество элементов может колебаться и коррелировать с сохраненным значением, поэтому, чтобы быть более безопасным, чтобы подсчет "colorsCount" был или никогда не был действительным значением, я закончил реализацию следующего и хотел добавить к обсуждению:

MYColor.h

typedef NS_ENUM( NSInteger, MYColorType )
{
    MYColorType0 = 0,
    MYColorType1,
    MYColorType2,
    MYColorType3
};

static inline MYColorType MYColorTypeFirst() { return MYColorType0; }
static inline MYColorType MYColorTypeLast() { return MYColorType3; }

ViewController.m

for ( int i = MYColorTypeFirst(); i <= MYColorTypeLast(); i++ )
{
    MYColor * color = [[MYColor alloc] initWithType:i];
    ...
}

Значимым дополнением является определение MYColorTypeFirst() и MYColorTypeLast(), которое используется в итерации for(), помещенной рядом с определением перечисления для удобства обслуживания.

Ответ 5

В случаях, когда я не являюсь автором перечисления, я делаю это так. Я думаю, что это безопасно в будущем, поскольку он не заботится о том, как действительно реализуются типы перечислений.

    UISwipeGestureRecognizerDirection allDirections[] = {
        UISwipeGestureRecognizerDirectionDown,
        UISwipeGestureRecognizerDirectionLeft,
        UISwipeGestureRecognizerDirectionRight,
        UISwipeGestureRecognizerDirectionUp
    };

    for (int i = 0; i < sizeof(allDirections)/sizeof(allDirections[0]); ++i) {
        UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onSwipe:)];
        swipeGesture.direction = allDirections[i];
        [self addGestureRecognizer:swipeGesture];
    }