循环枚举值

问题描述 投票:0回答:9

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

c objective-c enums
9个回答
56
投票

给定

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

您可以迭代元素,例如:

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

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


9
投票

如果枚举定义如下:

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

你可以这样循环:

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

9
投票

这有点混乱(就像整个概念一样......呃......)但是如果你要多次执行此操作,并且你希望能够处理不连续枚举的可能性,您可以创建一个(全局常量)数组,并具有(使用 ennukiller 的示例) Directions Directions[4] = {East, West, North, South}; 然后在循环中您可以讨论方向[i],而不是直接迭代方向本身...

正如我所说,它很丑,但我认为它稍微不那么脆弱......


7
投票

对于非连续枚举,您可以通过执行以下操作来迭代有效值:

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
投票

为了寻找这个,我刚刚炮制了以下满足我自己要求的解决方案。我想我应该将其发布在这里,供搜索类似内容的人使用。

假设我有一个枚举。

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

为了能够循环它,我定义了以下预处理器宏。

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

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

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

这将迭代逻辑放在一处(宏),从而提高了代码的可维护性。


2
投票

任何枚举的长度(项目数)都可以通过获取枚举中的名称数组并利用数组的长度来确定。使用 Enum 的 GetNames 方法。 Enum.GetNames(enumType).Length.

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

1
投票

我喜欢从这里得到的东西 Objective C 中枚举的迭代?

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


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

这样你以后就可以继续添加枚举而不影响你的循环?


1
投票

如果上述内容对您不起作用,因为您使用的是 C++,以下内容应该

enum Foo {
  One,
  Two,
  Three,
  Last
};

for ( int fooInt = One; fooInt != Last; fooInt++ )
{
   Foo foo = static_cast<Foo>(fooInt);
   // ...
}

0
投票

我讨厌用“最后”条目弄脏我的枚举(以及附带的注释,它不应该被使用,并且它总是必须保留,好吧,最后),并且只找到了一种解决它的方法(其他)而不是使用最后一个枚举条目作为秘密“最后”,这再次让我感到恶心)。

如果您使用 X Macros 定义枚举,您可以非常简单地获得枚举中的项目数。当您可能使用此方法时,请参阅链接 FMI - 为简单起见,其外观如下:

#define COLOR_TABLE \
X(red, "red")       \
X(green, "green")   \
X(blue, "blue")

#define X(a, b) a,
enum COLOR {
  COLOR_TABLE
};
#undef X

#define X(a, b) b,
char *color_name[] = {
  COLOR_TABLE
};
#undef X

#define X(a, b) +1
int color_count = 0 COLOR_TABLE;
#undef X
© www.soinside.com 2019 - 2024. All rights reserved.