在工作中,
枚举类型的使用优势没啥好说的。但经常需要将它与字串进行转换方便显示或其它需求。可惜原生的枚举值只能是int常量,并不支持字符串,我们只能自己对枚举值进行转换,一般有两种方案:
然后用 KGenderString(type) type 为枚举值,如传入 KFemale , KGenderString( KFemale ) 返回的是字符串 -- 女, 即达到我们的目的,另外
方案1中,多是先声明,然后在实现文件里创建一个映射表。这样带来的问题就是要分两个文件来管理,带来管理不方便不好。使用前还在确保映射表已经初始化。显然使用时还是有些许难受。
如果全部改用宏来实现则会好管理很多,而且对于映射表可以采用惰性初始化原则,即只有访问到时才创建。这就是方案2,也是这篇博客的重点。
方法是:先在.h头文件中定义枚举:
#ifndef _GENDER_H__
#define _GENDER_H__
// 性别
typedef enum {
/** 未知 */
KUnKnow = 0,
/** 男 */
KMale = 1,
/** 女 */
KFemale = 2
}Gender;
#endif
接下来在需要用到枚举值的实现文件中写下宏定义:
<pre name="code" class="objc">const NSArray *___Gender;
// 创建初始化函数。等于用宏创建一个getter函数
#define cGenderGet (___Gender == nil ? ___Gender = [[NSArray alloc] initWithObjects:\
@"未知",\
@"男",\
@"女", nil] : ___Gender)
// 枚举 to 字串
#define KGenderString(type) ([cGenderGet objectAtIndex:type])
// 字串 to 枚举
#define KGenderEnum(string) ([cGenderGet indexOfObject:string])
然后用 KGenderString(type) type 为枚举值,如传入 KFemale , KGenderString( KFemale ) 返回的是字符串 -- 女, 即达到我们的目的,另外
<span style="font-family: Arial, Helvetica, sans-serif;">KGenderEnum(string)可以实现字符串转成枚举值.</span>