变更记录
方案名称
语法 - Objective-C 中实现枚举类型(Enum)与字符串(NSString)互相转换
关键字
语法 \ 枚举类型 \ Enum \ 字符串 \ NSString \ 转换 \ 转化
需求场景
- 需要在 Objective-C 中支持枚举类型与字符串转换时
参考链接
- 简书 - 深入浅出理解有限状态机(推荐)
- Stacck Overflow - Easy way to use variables of enum types as string in c
详细内容
宏定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #pragma mark - Enum Factory Macros
// expansion macro for enum value definition #define ENUM_VALUE(name,assign) name assign,
// expansion macro for enum to string conversion #define ENUM_CASE(name,assign) case name: return @#name;
// expansion macro for string to enum conversion #define ENUM_STRCMP(name,assign) if ([string isEqualToString:@#name]) return name;
/// declare the access function and define enum values #define DECLARE_ENUM(EnumType,ENUM_DEF) \ typedef enum EnumType { \ ENUM_DEF(ENUM_VALUE) \ }EnumType; \ NSString *NSStringFrom##EnumType(EnumType value); \ EnumType EnumType##FromNSString(NSString *string); \
// Define Functions #define DEFINE_ENUM(EnumType, ENUM_DEF) \ NSString *NSStringFrom##EnumType(EnumType value) \ { \ switch(value) \ { \ ENUM_DEF(ENUM_CASE) \ default: return @""; \ } \ } \ EnumType EnumType##FromNSString(NSString *string) \ { \ ENUM_DEF(ENUM_STRCMP) \ return (EnumType)0; \ }
|
使用说明
1)设置枚举初始值
1 2 3 4
| #define TEST_STATUS(XX) \ XX(kTestStatusOK, = 0) \ XX(kTestStatusCached, )\ XX(kTestStatusRetry, )
|
2)声明枚举和字符串转换函数
1
| DECLARE_ENUM(TestStatus, TEST_STATUS)
|
3)定义枚举类型和字符串转换函数
1
| DEFINE_ENUM(TestStatus, TEST_STATUS)
|
4)使用枚举类型和字符串转换函数
1 2
| NSString *testStatus = NSStringFromTestStatus(kTestStatusOK); TestStatus statusFromString = TestStatusFromNSString(@"kTestStatusCached");
|
效果图
(无)
备注
(无)