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的评论; 如果枚举项是非连续的(例如,因为您为某些项指定了显式的,非连续的值),这根本不起作用.让人惊讶.
它有点像kludge(就像整个概念那样......呃......)但是如果你要多次这样做,并且你想要能够处理非连续枚举的可能性,你可以创建一个(全局常量)数组,并且(使用ennukiller的例子)方向指示[4] = {东,西,北,南}; 然后在你的循环中你可以谈论方向[i]而不是直接在方向本身上迭代......
正如我所说的那样,它很难看,但我觉得它的脆弱性稍差......
如果你的枚举定义如下:
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)
为了寻找这个,我只是编造了以下满足我自己要求的解决方案.我以为我会在这里发布它,供搜索类似内容的人使用.
说我有一个枚举.
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)