循环遍历枚举值

时间:2009-11-02 17:56:02

标签: c objective-c enums

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

9 个答案:

答案 0 :(得分:37)

鉴于

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

你可以迭代像:

这样的元素
for(int i=Bar; i<=Last; i++) {
  ...
}

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

答案 1 :(得分:8)

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

正如我所说,它很难看,但我认为它的脆弱性稍差......

答案 2 :(得分:7)

如果你的枚举定义如下:

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

你可以这样循环:

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

答案 3 :(得分:5)

为了寻找这个,我只是编造了以下满足我自己要求的解决方案。我以为我会把它发布在那里搜索类似的东西。

说我有一个枚举。

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

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

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

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

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

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

答案 4 :(得分:5)

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

[self.navigationController setNavigationBarHidden:YES animated:YES]

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

我喜欢从这里得到的东西 Iteration over enum in Objective C?

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


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

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

答案 7 :(得分:0)

我讨厌用一个&#34; Last&#34;弄脏我的枚举。条目(以及随附的说明它不应该被使用,并且它总是被保留,好,最后),并且只找到一种方法(除了使用最后一个enum条目作为秘密& #34;最后,&#34;这再次让我感到icky。)

如果您使用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

答案 8 :(得分:0)

如果由于您使用的是C ++,上述方法对您不起作用,请the following should

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

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