iOS枚举的定义与使用

1,823 阅读2分钟

开发中使用枚举的目的——为了增加代码的可读性

分类

NS_ENUM、NS_OPTIONS 这两者在本质上并没有差别,都是用于定义枚举类型。但在使用中,NS_ENUM多用于一般枚举,而NS_OPTIONS则多用于带有移位运算的枚举。

定义

在类的.h文件中,在interface和import之间。

一. NS_ENUM,定义状态等普通枚举

typedef NS_ENUM(NSUInteger, myKeyBoardType) {
    KeyBoardTypeDefault = 0,
    KeyBoardTypeNumber,
    KeyBoardTypeEmail
};
····
// myKeyBoardType为枚举命名,对应于某个属性
@property(nonatomic,assign)NSUInteger myKeyBoardType;

状态枚举,不能共存,只能存在枚举值的其中一个。

二. NS_OPTIONS,定义选项 枚举的定义还支持 位运算的方式定义

typedef NS_OPTIONS(NSUInteger, TTGDirection) {
    TTGDirectionNone = 0,
    TTGDirectionTop = 1 << 0,   //2 2 10 转换成 10进制 2
    TTGDirectionLeft = 1 << 1,    //4 3 100 转换成 10进制 4
    TTGDirectionRight = 1 << 2,    //8 4 1000 转换成 10进制 8
    TTGDirectionBottom = 1 << 3    //16 5 10000 转换成 10进制 16
};

这里的选项是用位运算的方式定义的,选项枚举中各值可以同时存在。

应用场景:一个枚举变量可能要代表多个枚举值的时候

其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了。当加起来以后,就获取了一个新的值,那么为了保证这个值的唯一性,这个时候就体现了位运算的重要作用。位运算可以确保枚举值组合的唯一性。 因为位运算的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是 计算后的十进制值。打个比方: 通过上面的位运算方式设定好枚举以后,打印出来的枚举值分别是: 1 2 4 8 16 这5个数字,无论你如何组合在一起,也不会产生两个同样的数字。 ###使用 在需要的地方导入类文件,

外界对属性myKeyBoardType进行赋值时,会直接提示枚举中的选项。

应用——根据不同类型创建按钮

结合switch case 结构使用

typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
    MKButtonEdgeInsetsStyleTop, // image在上,label在下
    MKButtonEdgeInsetsStyleLeft, // image在左,label在右
    MKButtonEdgeInsetsStyleBottom, // image在下,label在上
    MKButtonEdgeInsetsStyleRight // image在右,label在左
};

@interface UIButton (ImageTitleSpacing)
@end

//用“或”运算同时赋值多个选项
TTGDirection direction = TTGDirectionTop | TTGDirectionLeft | TTGDirectionBottom;
 
//用“与”运算取出对应位
if (direction & TTGDirectionTop) {
    NSLog(@"top");
}
if (direction & TTGDirectionLeft) {
    NSLog(@"left");
}
if (direction & TTGDirectionRight) {
    NSLog(@"right");
}
if (direction & TTGDirectionBottom) {
    NSLog(@"bottom");