Итерация по enum в Objective C? - PullRequest
       0

Итерация по enum в Objective C?

42 голосов
/ 02 августа 2011

у меня

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

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

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

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

Ответы [ 5 ]

150 голосов
/ 02 августа 2011

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

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);

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

18 голосов
/ 02 августа 2011

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

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

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

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

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

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]);
}
13 голосов
/ 20 ноября 2013

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

enum Colour {
    firstColour = 0,

    white = firstColour,
    pink,
    yellow,
    blue,

    lastColour = blue
} Colour;

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

}
6 голосов
/ 01 марта 2014

Я пришел на этот пост, чтобы ответить и на этот вопрос.Ответ Гобры великолепен.Но мое количество элементов может колебаться и соответствовать сохраненному значению, поэтому, чтобы быть в большей безопасности, если счетчик 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 () итерации, расположенной рядом с определением перечисления для удобства сопровождения.

4 голосов
/ 23 декабря 2014

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

    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];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...