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

Зацикливание значений enum

Можно ли циклически перебирать значения enum в Objective-C?

4b9b3361

Ответ 1

Учитывая

enum Foo {Bar=0,Baz,...,Last};

вы можете выполнять итерацию таких элементов, как:

for(int i=Bar; i<=Last; i++) {
  ...
}

Обратите внимание, что это раскрывает истинно-единственную природу C-перечисления. В частности, вы можете видеть, что C-enum действительно не обеспечивает безопасность типа, поскольку вы можете использовать int вместо значения enum и наоборот. Кроме того, это зависит от порядка объявления значений перечисления: хрупкий, если не сказать больше. Кроме того, см. Комментарий Чака; если элементы перечисления являются несмежными (например, поскольку вы указали явные, не последовательные значения для некоторых элементов), это не будет работать вообще. Хлоп.

Ответ 2

Это немного kludge (как и вся концепция так... а...), но если вы собираетесь делать это несколько раз, и вы хотите иметь возможность иметь дело с возможностью не- смежные перечисления, вы можете создать массив (глобальная константа) и иметь (использовать пример ennukiller). Направления направления [4] = {Восток, Запад, Север, Юг}; а затем в вашей петле вы можете говорить о направлениях [i], а не повторять непосредственно по направлениям...

Как я уже сказал, это уродливо, но это немного менее хрупкое, я думаю...

Ответ 3

Если перечисление определяется следующим образом:

enum Direction {  East,  West,  North,  South};

Вы можете пропустить его так:

for ( int direction = East; direction <= South; ++direction)
{
   /* Do something with Direction
}

Ответ 4

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

Скажем, у меня есть перечисление.

typedef NS_ENUM (NSInteger, ISDirection) {
  ISDirectionUp,
  ISDirectionDown,
  ISDirectionLeft,
  ISDirectionRight
};

Чтобы иметь возможность перебрать его, я определяю следующий макрос препроцессора.

#define ISDirectionAllAsDir ISDirection dir = ISDirectionUp; dir <= ISDirectionRight; dir++

Затем я использую его внутри цикла, как такового:

for(ISDirectionAllAsDir) {
  NSLog(@"Direction %d", dir);
}

Это ставит логику для итерации в одном месте (макро), что повышает надежность обслуживания кода.

Ответ 5

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

enum {
    value_one   = 0,
    value_two   = 1,
    value_three = 3,
    value_max
}
for ( i = value_one; i < value_max; i++ )
{ 
    switch(i)
    {
        case value_one:
        case value_two:
        case value_three:
        case value_four:
        {
            /* ... Do something with valid enum value ... */
        }
        break;
        default:
            /* Found an invalid enum entry; ignore it */
        break;
    }
}

Ответ 6

Мне нравится то, что я получил отсюда Итерация по перечислению в Objective C?

typedef enum { ENUM1=0,  ENUM2, ENUM3, ENUM4 , TOTAL  } ;


for ( int i=ENUM1 ; i<TOTAL; i++)
{}

таким образом вы можете продолжать добавлять перечисления позже и не влиять на ваши циклы?

Ответ 7

Длина (количество элементов) любого перечисления может быть определена путем получения массива имен в перечислении и использования длины массива. Используйте метод GetNames Enum. Enum.GetNames(enumType).Length.

{
enum Pig { Snort, Sty, Oink, Curly };
const int Pig_Count = Enum.GetNames(typeof(Pig)).Length;
}

Ответ 8

enum direction = {South, North, East, West};

//this is used to loop through enum in the while loop, and will contain the enum length when the while loop finishes.
int index = 0;
while(direction[index] != null){
    index++;
}

//loop through all the values in the enum
for (int i = 0; i < index; i++){
    //your code here, 'direction[index]' will return the enum name
}