Objective-C 中是否可以循环遍历枚举值?
给定
enum Foo {Bar=0,Baz,...,Last};
您可以迭代元素,例如:
for(int i=Bar; i<=Last; i++) {
...
}
请注意,这暴露了 C 枚举的真正的 int 性质。特别是,您可以看到 C 枚举并没有真正提供类型安全,因为您可以使用 int 代替枚举值,反之亦然。此外,这取决于枚举值的声明顺序:至少可以说是脆弱的。另外请看Chuck的评论;如果枚举项不连续(例如,因为您为某些项指定了显式的非连续值),则这根本不起作用。哎呀。
如果枚举定义如下:
enum Direction { East, West, North, South};
你可以这样循环:
for ( int direction = East; direction <= South; ++direction)
{
/* Do something with Direction
}
这有点混乱(就像整个概念一样......呃......)但是如果你要多次执行此操作,并且你希望能够处理不连续枚举的可能性,您可以创建一个(全局常量)数组,并具有(使用 ennukiller 的示例) Directions Directions[4] = {East, West, North, South}; 然后在循环中您可以讨论方向[i],而不是直接迭代方向本身...
正如我所说,它很丑,但我认为它稍微不那么脆弱......
对于非连续枚举,您可以通过执行以下操作来迭代有效值:
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;
}
}
为了寻找这个,我刚刚炮制了以下满足我自己要求的解决方案。我想我应该将其发布在这里,供搜索类似内容的人使用。
假设我有一个枚举。
typedef NS_ENUM (NSInteger, ISDirection) {
ISDirectionUp,
ISDirectionDown,
ISDirectionLeft,
ISDirectionRight
};
为了能够循环它,我定义了以下预处理器宏。
#define ISDirectionAllAsDir ISDirection dir = ISDirectionUp; dir <= ISDirectionRight; dir++
然后我在循环中使用它,如下所示:
for(ISDirectionAllAsDir) {
NSLog(@"Direction %d", dir);
}
这将迭代逻辑放在一处(宏),从而提高了代码的可维护性。
任何枚举的长度(项目数)都可以通过获取枚举中的名称数组并利用数组的长度来确定。使用 Enum 的 GetNames 方法。 Enum.GetNames(enumType).Length.
{
enum Pig { Snort, Sty, Oink, Curly };
const int Pig_Count = Enum.GetNames(typeof(Pig)).Length;
}
我喜欢从这里得到的东西 Objective C 中枚举的迭代?
typedef enum { ENUM1=0, ENUM2, ENUM3, ENUM4 , TOTAL } ;
for ( int i=ENUM1 ; i<TOTAL; i++)
{}
这样你以后就可以继续添加枚举而不影响你的循环?
如果上述内容对您不起作用,因为您使用的是 C++,以下内容应该:
enum Foo { One, Two, Three, Last }; for ( int fooInt = One; fooInt != Last; fooInt++ ) { Foo foo = static_cast<Foo>(fooInt); // ... }
我讨厌用“最后”条目弄脏我的枚举(以及附带的注释,它不应该被使用,并且它总是必须保留,好吧,最后),并且只找到了一种解决它的方法(其他)而不是使用最后一个枚举条目作为秘密“最后”,这再次让我感到恶心)。
如果您使用 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