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( | )这两个值在一起,例如FlexibleLeftMargin0001 )和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),这允许按位或运算符( | )合并值。