美文网首页首页投稿(暂停使用,暂停投稿)iOS 开发 iOS Developer
猫猫学iOS之|(或)的理解,哪些地方的枚举能直接用|(或)连接

猫猫学iOS之|(或)的理解,哪些地方的枚举能直接用|(或)连接

作者: 翟乃玉 | 来源:发表于2016-06-27 16:28 被阅读136次

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://www.jianshu.com/notebooks/4236923/latest

一:问题来源

最早时候,猫在学习通知时候(是系统通知不是NSNotificationCenter)用到一种很奇特的写法:

    //注册通知
    if ([UIDevice currentDevice].systemVersion.doubleValue<8.0) {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
    }
    else {
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil]];
    }

这里在判断系统盘本后的设置中,我们用到了|符号来做连接。


111.png

这里用或符号,可以实现多选的效果,于是猫猫就像,我去,好牛逼,然后在有一次设置图片的时候,猫猫想让一张图片既要自动填充又要自动。。。说的好晕,就是想设置view的contentMode可以用两个枚举,比如UIViewContentModeTop | UIViewContentModeScaleAspectFill这样写。
然后猫就发现,猫天真了,真的没用。

二:解决

其实当时的问题并没有解决,只是说猫搞明白了为何用有的地方用或可以,而有的地方就不能用或。

1:发现

  • 首先我们进入UIViewContentMode的代码当中。

    Snip20160627_7.png
    这里可以看到,不能用或连接的定义的枚举是这样的。
  • 然后我们进入UIUserNotificationType的代码当中。

    Snip20160627_8.png
    可以用或来连接的枚举是这样的,用1 << 0 (位运算左移来定义的)

2:猜测

于是很容易,猫猜测肯定跟这个枚举的定义是否用左移来定义有关系,经过测试,所有的枚举 << 定义的都可以用 | 来连接,做判断,其他的都不行,只能一个一个的。

3:验证

  • 定义以下代码:
int a = 1 << 0; // 1 0001
int b = 1 << 1; // 2 0010
int c = 1 << 2; // 4 0100
int d = 1 << 3; // 8 1000

void content(int value)
{
    if (value & a) NSLog(@"value里面有a");
    if (value & b) NSLog(@"value里面有b");
    if (value & c) NSLog(@"value里面有c");
    if (value & d) NSLog(@"value里面有d");
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        content(a | b | c | d);
   }
    return 0;
}
  • 运行结果:
Snip20160627_15.png
  • 解析
    其实iOS底层就是这么做的,原理八九不离十,主要运用了 & 和 | 的运算符的特性:
    *** | 或 : 只要有1个是1, 结果就是1***
    *** & 与 : 只有2个都是1, 结果才是1***
    以及:
    *** 1 << n == 2的n次方***

然后可知,当我们用左移来定义时候,可以得到:
int a = 1 << 0 = 1 = 0001
int b = 1 << 1 = 2 = 0010
int c = 1 << 2 = 4 = 0100
int d = 1 << 3 = 8 = 1000
然后可以看出,abcd分别代表二进制的某一位是1,而进行&运算,就能得到了。

  • 重点:
    与和或就记住下面的就行了,实在不行就用系统自带的计算器吧。
    *** | 或 : 只要有1个是1, 结果就是1***
    *** & 与 : 只有2个都是1, 结果才是1***

相关文章

  • 猫猫学iOS之|(或)的理解,哪些地方的枚举能直接用|(或)连接

    猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客地址:http://www.jianshu.com...

  • 学以致用,知行合一,务实七则

    吾以为,学之要义在于用。或直接用于事,产生实际的效果;或用于理论,帮助我们理解事物。脱离了用的实际,学便就失去了意...

  • 2019-05-22

    人一能之,己百之。人十能之,己千之。果能此道矣,虽愚必明,虽柔必强。或生而知之,或学而知之,或困而知之,及其知之一...

  • RunTime理解1

    借阅:猫猫学iOS之RunTime理解运用 一:RunTime简介Objective-C是一门动态语言,他将一些工...

  • iOS开发:iOS13系统下的变动

    1、iOS13系统下直接用imageView设置textField的leftView或rightView,则不能自...

  • 2018-05-19

    以行践言学《四书》——《中庸》篇086 【或生而知之,或学而知之,或困而知之,及其知之,一也;或安而行之,或利而行...

  • 大学•中庸之道

    或生而知之,或学而知之,或困而知之,及其知之,一也。或安而行之,或利而行之,或勉强而行之,及其成功,一也。 我们的...

  • 大学•中庸之道

    或生而知之,或学而知之,或困而知之,及其知之,一也。或安而行之,或利而行之,或勉强而行之,及其成功,一也。 我们的...

  • 猫猫学iOS之RunTime理解运用

    猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客地址:http://www.jianshu.com...

  • (´・_・`) Xcode 9可以无线真机调试啦

    用数据线连接iOS11系统的手机和Xcode 9,打开Xcode菜单或模拟器:Windows->Device an...

网友评论

    本文标题:猫猫学iOS之|(或)的理解,哪些地方的枚举能直接用|(或)连接

    本文链接:https://www.haomeiwen.com/subject/amyzdttx.html