变更记录

序号 录入时间 录入人 备注
1 2017-06-16 Alfred Jiang -

方案名称

语法 - Objective-C 中实现枚举类型(Enum)与字符串(NSString)互相转换

关键字

语法 \ 枚举类型 \ Enum \ 字符串 \ NSString \ 转换 \ 转化

需求场景

  1. 需要在 Objective-C 中支持枚举类型与字符串转换时

参考链接

  1. 简书 - 深入浅出理解有限状态机(推荐)
  2. Stacck Overflow - Easy way to use variables of enum types as string in c

详细内容

宏定义

#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)设置枚举初始值

 #define TEST_STATUS(XX)  \
 XX(kTestStatusOK, = 0) \
 XX(kTestStatusCached, )\
 XX(kTestStatusRetry, )

2)声明枚举和字符串转换函数

DECLARE_ENUM(TestStatus, TEST_STATUS)

3)定义枚举类型和字符串转换函数

DEFINE_ENUM(TestStatus, TEST_STATUS)

4)使用枚举类型和字符串转换函数

NSString *testStatus = NSStringFromTestStatus(kTestStatusOK);
TestStatus statusFromString = TestStatusFromNSString(@"kTestStatusCached");

效果图

(无)

备注

(无)

results matching ""

    No results matching ""