OC中枚举写法 以及 字符串枚举探索
常见枚举写法
C语言模式的枚举写法:enum
typedef enum{
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
} KLType;
普通【整型】枚举写法 :NS_ENUM
typedef NS_ENUM(NSUInteger, KLType) {
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
};
位移枚举 :NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, KLType) {
KLTypeRed = 1 << 0,
KLTypeGreen = 1 << 1,
KLTypeOrange = 1 << 2,
};
字符串类型枚举实现方式探索
基于普通枚举,定义C方法实现
// 先定义一个常见的枚举
typedef NS_ENUM(NSUInteger, KLType) {
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
};
// 定义一个C方法,C方法就是通过枚举值匹配字符串
NSString *KLTypeString(KLType status) {
switch (status) {
case KLTypeRed:
return @"红色";
case KLTypeGreen:
return @"绿色";
case KLTypeOrange:
return @"橘色";
default:
return @"";
}
}
基于普通枚举,定义C数组,设置 枚举值为 index
// 先定义一个常见的枚举
typedef NS_ENUM(NSUInteger, KLType) {
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
};
// 这个是 Map NSString * 类型的数组
NSString *KLTypeStringMap[] = {
[KLTypeRed] = @"红色",
[KLTypeGreen] = @"绿色",
[KLTypeOrange] = @"橘色"
};
// 使用:
KLTypeStringMap[KLTypeRed];// 枚举值
日常做法 宏定义
#define KLTypeStringRed @"红色";
#define KLTypeStringGreen @"绿色";
#define KLTypeStringOrange @"橘色";
上面几种方式都能实现 枚举值 到 字符串的转换,但是有一个缺点:
KLTypeStringMap
和KLTypeString
不能直接作为一个类型 规定 传参类型。
定义一种新的数据类型
// 定义一个新的类型 是 NSSting * 类型 类型名字叫 KLTypeStr
typedef NSString *KLTypeStr NS_STRING_ENUM;
static KLTypeStr const KLTypeStringRed = @"红色";
static KLTypeStr const KLTypeStringGreen = @"绿色";
static KLTypeStr const KLTypeStringOrange = @"橘色";
Apple官方的做法
.h 文件中 -------------
typedef NSString *KLTypeStr NS_STRING_ENUM;
FOUNDATION_EXPORT KLTypeStr const KLTypeStringRed;
FOUNDATION_EXPORT KLTypeStr const KLTypeStringGreen;
FOUNDATION_EXPORT KLTypeStr const KLTypeStringOrange;
.m 文件中 --------------
NSString * const KLTypeStringRed = @"红色";
NSString * const KLTypeStringGreen = @"绿色";
NSString * const KLTypeStringOrange = @"橘色";
比较的时候
StringEnum1 == StringEnum2
直接比较的是内存地址,效率会更高。
相比会产生过多二进制文件的宏定义方式,假如宏定义比较多,建议用FOUNDATION_EXPORT。