是否可以在Objective-C中循环枚举值?
答案 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); // ... }