首页 > iOS中有关函数参数“|”标示符问题

iOS中有关函数参数“|”标示符问题

小问题,就是红色椭圆里面的参数,“|”这个标示符是什么意思,一个函数的参数可以传递两个值吗?


“|“是位运算符号,表示按位或:

按位或处理两个长度相同的二进制数, 两个相应的二进位中只要有一个为1, 该位的结果值为1. 例如
    0101 (十进制 5)
 OR 0011 (十进制 3)
  = 0111 (十进制 7)

具体逻辑建议题主自己去补一下”位运算“的课。

具体到截图代码,options参数接收的是一个掩码,可以参考手册的UIViewAnimationOptions说明,UIViewAnimationOptionCurveEaseIn和UIViewAnimationOptionAllowUserInteraction的值都是一个“左移位运算”的值,也是位运算的一种,最终计算结果相当于:动画使用UIViewAnimationOptionCurveEaseIn且UIViewAnimationOptionAllowUserInteraction(允许用户交互操作)。

这样的好处是,将多个options的值通过1个参数就传递了。

增加一下这个例子的具体运算过程:

#选项原值
enum {
    ...#省略部分
    UIViewAnimationOptionAllowUserInteraction = 1 << 1 #运算结果:2

    UIViewAnimationOptionCurveEaseInOut    = 0 << 16,#运算结果:0
    UIViewAnimationOptionCurveEaseIn       = 1 << 16,#运算结果:65536
    UIViewAnimationOptionCurveEaseOut      = 2 << 16,#运算结果:131072
    UIViewAnimationOptionCurveLinear       = 3 << 16,#运算结果:196608
    ...#省略部分
};typedef NSUInteger UIViewAnimationOptions;

#运算结果
(1 << 16) | (1 << 1) = 65538

#函数收到options参数后,会让可选的option都和上面的值做“按位与:&”操作
UIViewAnimationOptionAllowUserInteraction(1 << 1) & 65538 = 2, 为真
UIViewAnimationOptionCurveEaseIn(1 << 16) & 65538 = 65536, 为真
#上面2个我们通过位运算传进来的选项都为真,就都会生效了,那么其它的的选项呢?
#可以自己试试,运算结果都为0,即假了

参考:wikipedia:位操作


按自己的理解补充一下@samoay 的答案
这里UIViewAnimationOptions的例子有点复杂了,从一个简单的例子会更好的入手

//定义部分
typedef NS_OPTIONS(NSInteger, ECSlidingViewControllerAnchoredGesture) {
    ECSlidingViewControllerAnchoredGestureNone     = 0,
    ECSlidingViewControllerAnchoredGesturePanning  = 1 << 0,
    ECSlidingViewControllerAnchoredGestureTapping  = 1 << 1,
    ECSlidingViewControllerAnchoredGestureCustom   = 1 << 2,
    ECSlidingViewControllerAnchoredGestureDisabled = 1 << 3
};
//设置部分
self.slidingViewController.topViewAnchoredGesture = ECSlidingViewControllerAnchoredGestureTapping | ECSlidingViewControllerAnchoredGesturePanning;

在这个例子中AnchoredGesture状态的判断使用了0,和1二进制表达来判断状态
首先,NSInteger根据平台可能是32位或64位,如果是64位那么1的二进制表达就是63个0跟着一个1。为了方便这里只用一个字节8位说明,十进制1的二进制是00000001,那么
1 << 0 == 00000001
1 << 1 == 00000010
1 << 2 == 00000100

ECSlidingViewControllerAnchoredGestureTapping | ECSlidingViewControllerAnchoredGesturePanning == (1 << 1) | (1 << 0) == 00000010 | 00000001 == 00000011

库会根据传入的00000011,就可以判断两个状态同时存在,但是只传入了一个参数
在这个基础上充分利用64位,就可以判断更多

【热门文章】
【热门文章】