Obj-C中的多值枚举
在Cocoa和Cocoa Touch框架中,枚举被用作常量。 我了解如何使用它,除了在一种情况下,您可以通过|作为parameter passing多个值的情况 运营商。 像 :
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;
我怎样才能定义自己这种types的枚举(即什么<<
意味着什么),如何检查作为parameter passing的倍数值?
<<
是移位运算符。 所以1 << 2
告诉它将位移两个空格。
例:
二进制数字1
是:
0001
1 << 2
意味着将所有位移到左边的2个空格,结果是:
0100
或者4
。
因此,在你的例子中,每个ENUM的值是1,2,4,8,16等等。他们也可以将每个枚举设置为这些值。 但是,因为他们使用该枚举多个值,二进制值更清楚:
0001 0010 0100 1000
所以他们写了使用位移。
所以如果我OR( |
)这两个值在一起,例如FlexibleLeftMargin
( 0001
)和FlexibleWidth( 0010
),我会得到以下值:
0011
所以他们使用每一位作为一个标志,让他们知道你有多个值设置。
您现在可以使用AND运算符&
来确定是否有特定的值集。
0010 & 0011 = 0010
所以你可以这样做来检查你是否有一个枚举集合:
myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin); if((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) { // myenum has UIViewAutoresizingFlexibleLeftMargin set! }
希望这是有道理的。 有关按位操作的更彻底的解释,请阅读: Wikipedia〜位操作符或search“ 位操作符 ”
<<
是左移运算符,意思是向左移动左值N位。 在这种情况下,它将在枚举中设置一个位(位1,2,3,4,5),这允许按位或运算符( |
)合并值。