Можно ли циклически перебирать значения enum в Objective-C?
Зацикливание значений enum
Ответ 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
}