在 Cocoa 和 Cocoa Touch 框架中,枚举被用作常量。我了解如何使用它,除非在一种情况下,您可以使用 |
作为参数多值传递。运算符(operator)。喜欢在:
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;
我如何定义自己这种类型的枚举(即 <<
的含义)以及在作为参数传递时如何检查多个值?
最佳答案
<<
是位移运算符。所以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”
关于iphone - Obj-C 中的多值枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176149/