是否可以在目标c中迭代蒙版枚举

时间:2013-09-16 10:35:24

标签: objective-c enums iteration

我已经看到这在其他语言中是可行的,但在objective-c

中需要这样的东西

我有一个与此类似的枚举

typedef enum {
  option1 = 1 << 0,
  option2 = 1 << 1,
  option3 = 1 << 2
...
...
} SomePossibleOptions;

然后用户可以创建所需选项的掩码

SomePossibleOptions myOptions = option1 | option2;

[self.someObject performOperationsForOptions:myOptions];

-(void)performOperationsForOptions:(SomePossibleOptions)theOptions
{

if (myOptions & option1)
{
  // do something
}

if (myOptions & option2
{
 // do something
}

//(could use a switch statement)

}

但更愿意使用某种语法

foreach (option in myoption)
{
  //do something
}

1 个答案:

答案 0 :(得分:2)

有时我在我的普通枚举中使用一个名为“SomeEnumCount”的最后一个值,然后它具有枚举中我拥有的项目数,所以我可以为它做一个循环。

在你的情况下,它会是这样的:

typedef enum {
  option1 = 1 << 0,
  option2 = 1 << 1,
  option3 = 1 << 2,
...
...
  optionCount = 1 << n
} SomePossibleOptions;

或许你可以称之为OptionNone,如果你有这样的话,那将永远是最后一个。

要制作一个循环,你必须做出像这样的东西

NSInteger optionsCount = (int)log2(optionCount);
for (NSInteger i = 0; i < optionsCount; i++) {
    SomePossibleOptions option = (SomePossibleOptions)(1 << i);

    //handle your options here
}

我希望它有所帮助!

编辑:也许我误解了这个问题。如果你想只圈出被掩盖在一起的选项,你应该根据上面的内容编写一个函数。类似的东西:

- (NSArray *)optionsInMask:(SomePossibleOptions)maskedOptions {
    NSMutableArray * options = [NSMutableArray array];

    NSInteger optionsCount = (int)log2(optionCount);
    for (NSInteger i = 0; i < optionsCount; i++) {
        SomePossibleOptions option = (SomePossibleOptions)(1 << i);
        if (maskedOptions & option) {
            [options addObject:[NSValue valueWithInteger:option]];
        }
    }

    return [NSArray arrayWithArray:options];
}

然后你可以循环它:

for (NSValue * value in [self optionsInMask:myOptions]) {
    SomePossibleOption option = (SomePossibleOptions)[value integerValue];

    //your code here
}