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.