循环遍历枚举值

Fra*_*ank 36 c enums objective-c

是否可以在Objective-C中循环枚举值?

Bar*_*ark 39

特定

enum Foo {Bar=0,Baz,...,Last};
Run Code Online (Sandbox Code Playgroud)

你可以迭代这些元素:

for(int i=Bar; i<=Last; i++) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这暴露了C enum的真正只是一个int性质.特别是,您可以看到C enum并不真正提供类型安全性,因为您可以使用int代替枚举值,反之亦然.另外,这取决于枚举值的声明顺序:至少可以说是脆弱的.另外,请看Chuck的评论; 如果枚举项是非连续的(例如,因为您为某些项指定了显式的,非连续的值),这根本不起作用.让人惊讶.

  • 它还要求枚举中的所有项目都是连续的.但它是你得到的最好的. (10认同)
  • 这是一个纯粹的挑剔,但它的拼写反之亦然. (6认同)

Bri*_*tow 8

它有点像kludge(就像整个概念那样......呃......)但是如果你要多次这样做,并且你想要能够处理非连续枚举的可能性,你可以创建一个(全局常量)数组,并且(使用ennukiller的例子)方向指示[4] = {东,西,北,南}; 然后在你的循环中你可以谈论方向[i]而不是直接在方向本身上迭代......

正如我所说的那样,它很难看,但我觉得它的脆弱性稍差......

  • @ArtOfWarfare 我一直使用这个:`#define ENUM(type, ...) enum _##type { __VA_ARGS__ }; enum _##type type##s[] = { __VA_ARGS__ }`,虽然这只适用于连续的。我不使用非连续的枚举,因为这对我来说意味着糟糕的设计。此外,我在使用此宏的 C 代码中到处都有 `typedef struct _list List;`、`typedef enum _direction Direction`,这就是为什么我在类型前加上 _ 的原因。`ENUM(direction, NORTH, EAST, SOUTH, WEST);` 给出 `enum _direction { NORTH, EAST, SOUTH, WEST }; enum _direction Directions = { NORTH, EAST, SOUTH, WEST };` 我喜欢。 (2认同)

enn*_*ler 7

如果你的枚举定义如下:

enum Direction {  East,  West,  North,  South};
Run Code Online (Sandbox Code Playgroud)

你可以这样循环:

for ( int direction = East; direction <= South; ++direction)
{
   /* Do something with Direction
}
Run Code Online (Sandbox Code Playgroud)

  • 有一个更好的方法吗?只是好奇,但似乎取决于枚举值的声明顺序充其量是脆弱的. (3认同)
  • @Ed:是的,这很脆弱,没有更好的方法.根本不建议这样做. (3认同)

Clo*_*ddy 5

为了寻找这个,我只是编造了以下满足我自己要求的解决方案.我以为我会在这里发布它,供搜索类似内容的人使用.

说我有一个枚举.

typedef NS_ENUM (NSInteger, ISDirection) {
  ISDirectionUp,
  ISDirectionDown,
  ISDirectionLeft,
  ISDirectionRight
};
Run Code Online (Sandbox Code Playgroud)

为了能够遍历它,我定义了以下预处理器宏.

#define ISDirectionAllAsDir ISDirection dir = ISDirectionUp; dir <= ISDirectionRight; dir++
Run Code Online (Sandbox Code Playgroud)

然后我在循环中使用它,如下:

for(ISDirectionAllAsDir) {
  NSLog(@"Direction %d", dir);
}
Run Code Online (Sandbox Code Playgroud)

这将迭代的逻辑放在一个地方(宏),这增加了代码的可维护性.


小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)