在Cocoa和Cocoa Touch框架中,枚举用作常量.我知道如何使用它,除了在一种情况下,这种情况下你可以通过|操作符作为参数传递多个值.比如:

pageControl.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin);

enum声明如下:

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.

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

希望这是有道理的.

Objective-c相关问答推荐

Objective-C:为什么[对象复制]的两个请求返回相同的结果?

如何以编程方式获取iphone的IP地址

导航回上一个视图控制器

iOS - 如何预加载键盘?

来自 NSDate 的日期名称?

Objective-C:在字符串中查找数字

如何更改图像中的特定 colored颜色 ?

如何将 CGPoint 添加到 NSMutableArray?

iPhone:推送通知后如何删除徽章?

NSLocalizedString 格式

Objective C 代码是否有 github markdown 语言标识符?

滚动 NSScrollView 时的回调?

Interface Builder 中的 IBOutletCollection 集排序

判断用户是否在连续的 UISlider 上完成滑动?

使用正则表达式在 Xcode 中查找/替换

具有高质量代码的开源 Objective-C 项目?

在 NSString 对象中查找子字符串

iOS 上 64 位的 BOOL

从 NSMutableString 中删除最后一个字符

xcode 5.1 中的 Arm64 架构