枚举

OC中枚举常见写法

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};
// 适用于单个赋值 多个赋值的情况规则还没摸清楚 不是简单的相加
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0, //1   1   1
    UIViewAutoresizingFlexibleWidth        = 1 << 1, //2   10 转换成 10进制 2
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2, //4   100 转换成 10进制 4
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3, //8   1000 转换成 10进制 8
    UIViewAutoresizingFlexibleHeight       = 1 << 4, //16  10000 转换成 10进制 16
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5  //32  10000 转换成 10进制 32
};
// 适用于多个赋值 
  • 什么时候要用到NS_OPTIONS这种方式呢?
    那就是一个枚举变量可能要代表多个枚举值的时候. 其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了. 当加起来以后,就获取了一个新的值,那么为了保证这个值的唯一性,这个时候就体现了位运算的重要作用. 位运算可以确保枚举值组合的唯一性.
    打个比方: 通过上面的位运算方式设定好枚举以后,打印出来的枚举值分别是: 1 2 4 8 16 这5个数字,无论你如何组合在一起,也不会产生两个同样的数字.

  • 如果有个场景让我判断当前的view的Autoresizing有哪几个.我怎么判断呢?
    很简单.用按位与操作就行了.
    假设 autoResizings = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;
    我们判断autoResizings里是否有UIViewAutoresizingFlexibleLeftMargin的时候只需要if(autoResizings & UIViewAutoresizingFlexibleLeftMargin)是否为true就可以了.

//直接输入enum按代码补全提示写成
typedef enum : NSUInteger {
    MyEnumValueA,
    MyEnumValueB,
    MyEnumValueC,
} MyEnum;
// 单个赋值的时候也可以用这个
  • 推荐用上面的两种,单选的时候用NS_ENUM. 多选的时候用NS_OPTIONS.

你可能感兴趣的:(枚举)