1

我已经看到这在其他语言中是可能的,但在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
}
4

1 回答 1

3

有时我在我的普通枚举中使用名为“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
}
于 2013-09-16T11:03:06.277 回答