代码之家  ›  专栏  ›  技术社区  ›  gcamp

Obj-C中的多值枚举

  •  48
  • gcamp  · 技术社区  · 14 年前

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

    我如何定义自己这种类型的枚举(即 << 意味着)当作为参数传递时,如何检查倍数值?

    2 回复  |  直到 13 年前
        1
  •  114
  •   Joel    14 年前

    << 是位移运算符。所以 1 << 2 告诉它把两个空格移过去。

    例子:

    二进制数 1 是:

    0001
    

    1和lt;<2 意味着将所有位向左移动2个空格,从而产生此值:

    0100
    

    4 .

    因此,示例中每个枚举的值是,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 "

        2
  •  1
  •   Yann Ramin    14 年前

    << 是左移位运算符,意味着向左移动N位。在这种情况下,它在枚举中设置一个位(位1、2、3、4、5),允许按位或运算符( | )合并值。