扫码关注官方订阅号
小问题,就是红色椭圆里面的参数,“|”这个标示符是什么意思,一个函数的参数可以传递两个值吗?
人生最曼妙的风景,竟是内心的淡定与从容!
“|“是位运算符号,表示按位或:
按位或处理两个长度相同的二进制数, 两个相应的二进位中只要有一个为1, 该位的结果值为1. 例如 0101 (十进制 5) OR 0011 (十进制 3) = 0111 (十进制 7)
具体逻辑建议题主自己去补一下”位运算“的课。
具体到截图代码,options参数接收的是一个掩码,可以参考手册的UIViewAnimationOptions说明,UIViewAnimationOptionCurveEaseIn和UIViewAnimationOptionAllowUserInteraction的值都是一个“左移位运算”的值,也是位运算的一种,最终计算结果相当于:动画使用UIViewAnimationOptionCurveEaseIn且UIViewAnimationOptionAllowUserInteraction(允许用户交互操作)。
UIViewAnimationOptions
这样的好处是,将多个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中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
“|“是位运算符号,表示按位或:
具体逻辑建议题主自己去补一下”位运算“的课。
具体到截图代码,options参数接收的是一个掩码,可以参考手册的
UIViewAnimationOptions
说明,UIViewAnimationOptionCurveEaseIn和UIViewAnimationOptionAllowUserInteraction的值都是一个“左移位运算”的值,也是位运算的一种,最终计算结果相当于:动画使用UIViewAnimationOptionCurveEaseIn且UIViewAnimationOptionAllowUserInteraction(允许用户交互操作)。这样的好处是,将多个options的值通过1个参数就传递了。
增加一下这个例子的具体运算过程:
参考:wikipedia:位操作
按自己的理解补充一下@samoay 的答案
这里
UIViewAnimationOptions
的例子有点复杂了,从一个简单的例子会更好的入手在这个例子中AnchoredGesture状态的判断使用了0,和1二进制表达来判断状态
首先,NSInteger根据平台可能是32位或64位,如果是64位那么1的二进制表达就是63个0跟着一个1。为了方便这里只用一个字节8位说明,十进制1的二进制是00000001,那么
1 << 0 == 00000001
1 << 1 == 00000010
1 << 2 == 00000100
库会根据传入的00000011,就可以判断两个状态同时存在,但是只传入了一个参数
在这个基础上充分利用64位,就可以判断更多