在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;
如何定义自己这种类型的枚举(即<<
意味着什么)以及如何在作为参数传递时检查倍数值?
答案 0 :(得分:114)
<<
是bitshift运算符。所以1 << 2
告诉它将位移两位空格。
示例:
在二进制中,数字1
为:
0001
1 << 2
表示将所有位移到左侧2个空格,这会产生此值:
0100
或4
。
因此,示例中每个ENUM的值为1,2,4,8,16等。它们也可以将每个枚举设置为这些值。但由于它们将枚举用于多个值,因此二进制值使其更清晰:
0001
0010
0100
1000
因此他们使用位移来写。
所以,如果我将其中两个值合并(|
),例如FlexibleLeftMargin
(0001
)和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运算符(|
)组合值。