【问题标题】:Multiple value enum in Obj-CObj-C 中的多值枚举
【发布时间】:2011-05-09 17:39:28
【问题描述】:

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

我如何定义自己这种类型的枚举(即&lt;&lt; 的含义)以及在作为参数传递时如何检查多个值?

【问题讨论】:

    标签: iphone objective-c cocoa-touch cocoa enums


    【解决方案1】:

    &lt;&lt; 是位移运算符。所以1 &lt;&lt; 2 告诉它将位移动两个空格。

    例子:

    在二进制中,数字1 是:

    0001
    

    1 &lt;&lt; 2 表示将所有位向左移动 2 个空格,从而得到这个值:

    0100
    

    4

    因此,您示例中每个 ENUM 的值是 1、2、4、8、16 等。他们也可以将每个枚举设置为这些值。但由于他们将该枚举用于多个值,因此二进制值使其更加清晰:

    0001
    0010
    0100
    1000
    

    所以他们使用位移来编写。

    所以如果我 OR (|) 其中两个值在一起,例如 FlexibleLeftMargin (0001) 和 FlexibleWidth (0010),我会得到以下值:

    0011
    

    因此他们使用每个位作为标志,因此他们知道您设置了多个值。

    您现在可以使用 AND 运算符 &amp; 来确定您是否设置了特定值。

    0010 & 0011 = 0010
    

    所以你可以这样做来检查你是否设置了一个枚举:

    myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin);
    if((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) {
      // myenum has UIViewAutoresizingFlexibleLeftMargin set!
    }
    

    希望这是有道理的。 有关按位运算的更详尽解释,请阅读:Wikipedia ~ Bit Operators 或搜索“bit operators

    【讨论】:

    • 这很有道理,乔尔。感谢您的完整回复!
    • 你打赌。如果您有兴趣,我添加了一个链接来解释提到的运算符和一些额外的位运算符。
    • 这里要小心,因为您的示例不起作用。等式(==)在 C 中比按位和(&)具有更高的优先级,因此除非 (myenum&0x01) 为真,否则这将始终失败,我认为这不是您的意思。必须是 if( (myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMarging ) doSoemthing()
    • 参见 NS_OPTIONS 宏。
    【解决方案2】:

    &lt;&lt; 是左移运算符,表示将左值向左移动 N 位。在这种情况下,它在枚举中设置一个位(位 1、2、3、4、5),这允许按位 OR 运算符 (|) 组合值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多