iphone - Obj-C 中的多值枚举

标签 iphone objective-c cocoa-touch cocoa enums

在 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/

相关文章:

ios - UI 在执行 NSBatchDeleteRequest 时卡住

objective-c - heightForRowAtIndexPath不显示多行

iphone - TextField 覆盖 UIAlertView 的按钮

iOS,自动布局为 iPhone 5 添加边距/间隔,但不是 iPhone 4?

iphone - 应用内购买,SKProduct 本地化属性问题

ios - IAP 被拒绝,因为未提交所需的二进制文件问题

objective-c - 添加到 View 的 subview 的 UIButton 不会响应

objective-c - 如何在 XCode 中使用调试器检查变量的值

iphone - 按下 UIWebView 中的 textField 时显示 ViewController

iphone - NSFetchedResultsChangeUpdate 被触发而不是 NSFetchedResultsChangeDelete