iOS中有关函数参数“|”标示符问题
黄舟
黄舟 2017-04-17 11:50:58
[iOS讨论组]

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
PHP中文网

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

按位或处理两个长度相同的二进制数, 两个相应的二进位中只要有一个为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位,就可以判断更多

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号