美文网首页
复选枚举(位移枚举)的实现逻辑

复选枚举(位移枚举)的实现逻辑

作者: Mark_Guan | 来源:发表于2016-11-23 15:04 被阅读60次

下面我们先来看看我们在开发中经常使用的苹果为我们提供的两个枚举值:

NS_ENUM

typedef NS_ENUM(NSInteger, UIButtonType) {
    UIButtonTypeCustom = 0,                         // no button type
    UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS(7_0),  // standard system button

    UIButtonTypeDetailDisclosure,
    UIButtonTypeInfoLight,
    UIButtonTypeInfoDark,
    UIButtonTypeContactAdd,
    
    UIButtonTypePlain API_AVAILABLE(tvos(11.0)) API_UNAVAILABLE(ios, watchos), // standard system button without the blurred background view
    
    UIButtonTypeRoundedRect = UIButtonTypeSystem   // Deprecated, use UIButtonTypeSystem instead
};

该类型的枚举我们只能传递一个值,不能组合使用,比如:

UIButton *loginBtn = [UIButton buttonWithType:UIButtonTypeCustom];

关于这种枚举没有什么多说的,今天我们重点讨论的是下面的这种枚举以及实现方式

NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0, 
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

这种枚举与上面的不同,在使用的时候我们可以组合使用,传递多个值 比如:

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;

那么不知道读者有没有想过这样一个问题,我们传递了多个数据,那么程序内部是如何去判断我们分别传递了那些值呢?

再具体的分析之前我们先来回忆一下 位运算的相关知识

|
如果两个相应的二进制位只要有一个是1,结果就是1;否则为0。
比如

  00000001
| 00000010
____________
  00000011

&
如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
比如

    00000011            00000011                           00000011 

  & 00000001          & 00000010   &上一个之前不包含的数据=> & 00000100
  ____________       ______________                     ______________
    00000001            00000010                           00000000

通过上面的运算我们可以看到 通过 & 运算之后可以得到它本身.
也就是如果e = a| b | c | d,那么e & a 、e & b 、e & c 、 e & d都为true.
就是说你这个枚举值包含了那些原始枚举值,&操作值都为true.否则为false

<<
向左移一位,右边自动补0
比如 1 << 1 = 2

  00000001 << 1

  00000010 = 2

所以通过上面的分析我们不难猜出位移枚举的内部判断逻辑应该是这样的:

- (void)setOptions:(UIViewAutoresizing)options
{
    if (options & UIViewAutoresizingFlexibleWidth) {
        NSLog(@"包含了UIViewAutoresizingFlexibleWidth");
    }
    
    if (options & UIViewAutoresizingFlexibleHeight) {
        NSLog(@"包含了UIViewAutoresizingFlexibleWidth");
    }
    
    if (options & UIViewAutoresizingFlexibleTopMargin) {
        NSLog(@"包含了UIViewAutoresizingFlexibleWidth");
    }
}

相关文章

  • 复选枚举(位移枚举)的实现逻辑

    下面我们先来看看我们在开发中经常使用的苹果为我们提供的两个枚举值: NS_ENUM 该类型的枚举我们只能传递一个值...

  • 位移枚举

    位移枚举和普通枚举的区别位移枚举可以传递多个参数,普通的枚举只能传递单个参数 举个?在SDWebimage里有的地...

  • 位移枚举

    位移枚举 C语言枚举定义 苹果创建枚举的定义方式

  • 位移枚举简单介绍

    枚举的三种实现方式 第一种枚举 第二种枚举定义类型 ** 第三种枚举** 位移枚举在这感谢下原文作者[天狐博客]|...

  • 位移枚举

    位移枚举 一. OC中常见的三种枚举 C语言枚举 // C语言枚举 typedef enum : NSUInteg...

  • Swift&OC位移枚举区别

    1、Swift 位移枚举写法 2、ObjC位移枚举写法 相比之下ObjC更加简单明了。

  • iOS枚举(位移枚举)

    什么是枚举 在程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中用自然语言...

  • OC中枚举写法 以及 字符串类型枚举实现探索

    常见枚举写法 C语言模式的枚举写法:enum 普通【整型】枚举写法 :NS_ENUM 位移枚举 :NS_OPTIO...

  • 位移枚举

    枚举的其中一种方式:位移枚举,直接上代码,看完基本就懂了 写一个方法: 在viewDidLoad方法中调用本方法:

  • 位移枚举

网友评论

      本文标题:复选枚举(位移枚举)的实现逻辑

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