Obj-C中的多值枚举

时间:2010-11-14 04:11:22

标签: iphone objective-c cocoa-touch cocoa enums

在Cocoa和Cocoa Touch框架中,枚举用作常量。我理解如何使用它,除了在一种情况下,您可以使用|运算符作为参数多个值传递的情况。喜欢在:

pageControl.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin);

枚举声明如下:

enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;

如何定义自己这种类型的枚举(即<<意味着什么)以及如何在作为参数传递时检查倍数值?

2 个答案:

答案 0 :(得分:114)

<<是bitshift运算符。所以1 << 2告诉它将位移两位空格。

示例:

在二进制中,数字1为:

0001

1 << 2表示将所有位移到左侧2个空格,这会产生此值:

0100

4

因此,示例中每个ENUM的值为1,2,4,8,16等。它们也可以将每个枚举设置为这些值。但由于它们将枚举用于多个值,因此二进制值使其更清晰:

0001
0010
0100
1000

因此他们使用位移来写。

所以,如果我将其中两个值合并(|),例如FlexibleLeftMargin0001)和FlexibleWidth(0010),我会得到以下值:

0011

因此,他们将每个位用作标志,以便他们知道您设置了多个值。

您现在可以使用AND运算符&来确定您是否设置了特定值。

0010 & 0011 = 0010

所以你可以这样做来检查你是否设置了一个枚举:

myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin);
if((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) {
  // myenum has UIViewAutoresizingFlexibleLeftMargin set!
}

希望这是有道理的。 有关按位运算的更详尽解释请阅读:Wikipedia ~ Bit Operators或搜索“bit operators

答案 1 :(得分:1)

<<是左移位运算符,意味着将左侧值N位向左移动。在这种情况下,它在枚举中设置一个位(位1,2,3,4,5),这允许按位OR运算符(|)组合值。