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