背景:
服务端返回的是string
类型的枚举,我们常用的int
类型的枚举,Swift
是直接支持string
类型的枚举的,但是Objective-C
中string
类型的枚举不常用,因此记录一下。
1、基于普通枚举,定义C方法实现
// 先定义一个常见的枚举
typedef NS_ENUM(NSUInteger, FTType) {
FTTypeRed = 1,
FTTypeGreen = 2,
FTTypeOrange = 3,
};
// 定义一个C方法,C方法就是通过枚举值匹配字符串
NSString *FTTypeString(FTType status) {
switch (status) {
case FTTypeRed:
return @"红色";
case FTTypeGreen:
return @"绿色";
case FTTypeOrange:
return @"橘色";
default:
return @"";
}
}
2、基于普通枚举,定义C数组,设置 枚举值为 index
// 先定义一个常见的枚举
typedef NS_ENUM(NSUInteger, FTType) {
FTTypeRed = 1,
FTTypeGreen = 2,
FTTypeOrange = 3,
};
// 这个是 Map NSString * 类型的数组
NSString *FTTypeStringMap[] = {
[FTTypeRed] = @"红色",
[FTTypeGreen] = @"绿色",
[FTTypeOrange] = @"橘色"
};
// 使用:
FTTypeStringMap[FTTypeRed];// 枚举值
日常做法 宏定义
#define FTTypeStringRed @"红色";
#define FTTypeStringGreen @"绿色";
#define FTTypeStringOrange @"橘色";
上面几种方式都能实现 枚举值 到 字符串的转换,但是有一个缺点:
FTTypeStringMap
和FTTypeString
不能像枚举类型一样直接作为一个类型 限定 传参类型。
定义一种新的数据类型
// 定义一个新的类型 是 NSSting * 类型 类型名字叫 FTTypeStr
typedef NSString *FTTypeStr NS_STRING_ENUM;
static FTTypeStr const FTTypeStringRed = @"红色";
static FTTypeStr const FTTypeStringGreen = @"绿色";
static FTTypeStr const FTTypeStringOrange = @"橘色";
Apple官方的做法
// .h 文件中 -------------
typedef NSString *FTTypeStr NS_STRING_ENUM;
FOUNDATION_EXPORT FTTypeStr const FTTypeStringRed;
FOUNDATION_EXPORT FTTypeStr const FTTypeStringGreen;
FOUNDATION_EXPORT FTTypeStr const FTTypeStringOrange;
// .m 文件中 --------------
NSString * const FTTypeStringRed = @"红色";
NSString * const FTTypeStringGreen = @"绿色";
NSString * const FTTypeStringOrange = @"橘色";
比较的时候
StringEnum1 == StringEnum2
直接比较的是内存地址,效率会更高。
相比会产生过多二进制文件的宏定义方式,假如宏定义比较多,建议用FOUNDATION_EXPORT
。
使用
FTTypeStr aa = @"绿色";//FTTypeStringRed;
if (aa == FTTypeStringGreen) {
NSLog(@"诶~ 颜色一样哦");
} else {
NSLog(@"诶~ 颜色不同哦");
}