美文网首页
iOS 枚举 NS_OPTIONS和enum 位移枚举和枚举

iOS 枚举 NS_OPTIONS和enum 位移枚举和枚举

作者: 豆豆哥哥 | 来源:发表于2019-05-20 14:12 被阅读0次

1. NS_OPTIONS是个什么的东西

基本概念

<< 位运算 2进制中所有的bit向左移动

0000 0001  << 1   0000 0010 1  -> 2
0000 0001  << 2   0000 0100 1 -> 4
0000 0001  << 2   0000 1000 1 -> 8
image.png

& 运算

1 & 2 -> 0001 & 0010 = 0000 NO
7 & 4 -> 0111 * 0001 = 0001  ture
11 & 4 -> 1011 * 0001 = 0001  ture
11 & 7 -> 1011 * 0111 = 0011 ture
11 & 4 ->1011 &0100 = 0000 NO

| 运算

1 | 2 -> 0001 | 0010 = 0011
1 |2 |4  - >  0001 | 0010 |0100 -> 0111 

有什么用处

就是能合并传参

了解

typedef NS_OPTIONS(NSUInteger, UIControlEvents) {
    UIControlEventTouchDown                = 1 <<  0,      // 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。
    UIControlEventTouchDownRepeat          = 1 <<  1,      // 多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。
    UIControlEventTouchDragInside          = 1 <<  2,      //当一次触摸在控件窗口内拖动时
    UIControlEventTouchDragOutside         = 1 <<  3,      //当一次触摸在控件窗口之外拖动时。
    UIControlEventTouchDragEnter           = 1 <<  4,      //当一次触摸从控件窗口之外拖动到内部时。
    UIControlEventTouchDragExit            = 1 <<  5,      //当一次触摸从控件窗口内部拖动到外部时。
    UIControlEventTouchUpInside            = 1 <<  6,      //所有在控件之内触摸抬起事件。
    UIControlEventTouchUpOutside           = 1 <<  7,      //所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)
    UIControlEventTouchCancel              = 1 <<  8,      //所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。
    UIControlEventValueChanged             = 1 << 12,      //当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送
    UIControlEventPrimaryActionTriggered   = 1 << 13,      //当控件的首要行为被触发,例如button的点击事件,slider的滑动事件。iOS_9之后可用
    UIControlEventEditingDidBegin          = 1 << 16,      //当文本控件中开始编辑时发送通知。
    UIControlEventEditingChanged           = 1 << 17,      //当文本控件中的文本被改变时发送通知。
    UIControlEventEditingDidEnd            = 1 << 18,      //当文本控件中编辑结束时发送通知
    UIControlEventEditingDidEndOnExit      = 1 << 19,      // 当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。
    UIControlEventAllTouchEvents           = 0x00000FFF,      //通知所有触摸事件。
    UIControlEventAllEditingEvents         = 0x000F0000,      //通知所有关于文本编辑的事件。
    UIControlEventApplicationReserved      = 0x0F000000,      // 为应用程序预留
    UIControlEventSystemReserved           = 0xF0000000,      //为系统内部框架预留
    UIControlEventAllEvents                = 0xFFFFFFFF       //通知所有事件。
};
- (void)viewDidLoad {
    [super viewDidLoad];
//根据| 运输可知 
// controlEvent =  1 << 0| 1 << 6|1 << 12|1 << 16 |1 << 19;
//controlEvent =   1         | 64      | 4096  | 65536 | 524288;
//controlEvent = 0001 | 0010 0000 ..... = 反正就是一大堆的加在一起了
//controlEvent = 593985;

    UIControlEvents   controlEvent = UIControlEventTouchDown | UIControlEventTouchUpInside | UIControlEventValueChanged | UIControlEventEditingDidBegin | UIControlEventEditingDidEndOnExit;

    [self recognizeOrientation:controlEvent]; 
}

解析的时候

- (void)recognizeOrientation:(UIControlEvents)controlEventType{
    
    if (controlEventType & UIControlEventTouchDown) {
        
        NSLog(@"UIControlEventTouchDown");
    }
    if (controlEventType & UIControlEventTouchDownRepeat) {
        
        NSLog(@"UIControlEventTouchDownRepeat");
    }
    if (controlEventType & UIControlEventTouchDragInside) {
        
        NSLog(@"UIControlEventTouchDragInside");
    }
    if (controlEventType & UIControlEventTouchDragOutside) {
        
        NSLog(@"UIControlEventTouchDragOutside");
    }
    if (controlEventType & UIControlEventTouchDragEnter) {
        
        NSLog(@"UIControlEventTouchDragEnter");
    }
    if (controlEventType & UIControlEventTouchDragExit) {
        
        NSLog(@"UIControlEventTouchDragExit");
    }
    if (controlEventType & UIControlEventTouchUpInside) {
        
        NSLog(@"UIControlEventTouchUpInside");
    }
    
    if (controlEventType & UIControlEventTouchCancel) {
        
        NSLog(@"UIControlEventTouchCancel");
    }
    if (controlEventType & UIControlEventValueChanged) {
        
        NSLog(@"UIControlEventValueChanged");
    }
    if (controlEventType & UIControlEventPrimaryActionTriggered) {
        
        NSLog(@"UIControlEventPrimaryActionTriggered");
    }
    if (controlEventType & UIControlEventEditingDidBegin) {
        
        NSLog(@"UIControlEventEditingDidBegin");
    }
    if (controlEventType & UIControlEventEditingChanged) {
        
        NSLog(@"UIControlEventEditingChanged");
    }
    if (controlEventType & UIControlEventEditingDidEnd) {
        
        NSLog(@"UIControlEventEditingDidEnd");
    }
    if (controlEventType & UIControlEventEditingDidEndOnExit) {
        
        NSLog(@"UIControlEventEditingDidEndOnExit");
    }

}
每一个都参与 & 的计算比较 就能得出你的值
你是用那几个枚举 拼起来的数据

2.枚举

枚举(Enum)是C语言中的一种基本数据类型,是一个"被命名的整型常量"的集合

不参与内存的占用和释放

enum与状态(states)

//定义枚举类型    
//typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
typedef enum _SKYState {
    SKYStateOK  = 0,
    SKYStateError,
    SKYStateUnknow
} SKYState;

//指明枚举类型
//-------in parameters---------------    
@property (nonatomic,assign) SKYState state; //操作类型  

使用枚举 1次只能1次传值,相互

3.使用eg

typedef NS_OPTIONS (NSInteger,est){
test1 = 1<< 0;
test2 = 1<< 1;
test3 = 1<< 2;
test4 = 1<< 3;
}

状态的储存和 复原

储存
Test test = test0 |test1 |test2 ;

[[NSUserDefaults standardUserDefaults] setValue:@(test )forKey:@"test"];

//复原
NSIntegre test=[ [[NSUserDefaults standardUserDefaults] valueForKey:@"test"] intValue];
if(test1 & test ){
包含状态1
}
if(test2 & test ){
包含状态2
}
if(test3& test ){
包含状态3
}
if(test4 & test ){
包含状态4
}


思想 就是根据每个 2 进制位的0 或 1 与 目标相对应的那一位是否相同 就是& 相同就包含了该目标.

异或

异或.png

逻辑“异或”和“或”有所不同,它具有排异性,也就是说如果参与操作的位相同,那么最终结果就为0(假),否则为 1(真)。 所以,如果要得到1,参与操作的两个位必须不同,这就是此处“异”的含义。我们将二进制110101和100011的每一位对⻬,进 行按位的“异或”操作,可以得到结果是10110。

110101
异或
100011
   |  
   V
010110

每个 2 进制 对其进行异或 都能得到第 2 位

面试题

交换2个数的值,不使用其他变量

A = A^B
B = A^B
A =A^B

交换了位置

相关文章

网友评论

      本文标题:iOS 枚举 NS_OPTIONS和enum 位移枚举和枚举

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