iOS 字符串枚举
我们日常开发中常见或者常用的枚举都是整数型,类似于这样的:
typedef NS_ENUM(NSUInteger, HPTodayWeatherType) {
/// Sunny:晴天;
HPTodayWeatherTypeSunny = 0,
/// Rain:雨天;
HPTodayWeatherTypeRain,
/// Windy:大风天
HPTodayWeatherTypeWindy,
};
其实,iOS系统代码里面有这样一个宏定义:
#define NS_STRING_ENUM _NS_TYPED_ENUM
我们可以利用这个宏定义去实现字符串枚举,在HPStringEnum.h文件中添加以下代码:
**
/// 定义一个HPTodayWeatherStateMsg的字符串类型作为枚举类型,可以定义字符串类型的枚举。
typedef NSString *HPTodayWeatherStateMsg NS_STRING_ENUM;
/// 声明以下三个枚举值
/// Sunny:晴天
FOUNDATION_EXPORT HPTodayWeatherStateMsg const HPTodayWeatherStateMsgSunny;
/// Rain:雨天
FOUNDATION_EXPORT HPTodayWeatherStateMsg const HPTodayWeatherStateMsgRain;
/// Windy:大风天
FOUNDATION_EXPORT HPTodayWeatherStateMsg const HPTodayWeatherStateMsgWindy;
然后在HPStringEnum.m文件中添加以下代码:
NSString * const HPTodayWeatherStateMsgSunny = @"晴天";
NSString * const HPTodayWeatherStateMsgRain = @"雨天";
NSString * const HPTodayWeatherStateMsgWindy = @"大风天";
这样就可以了,我们看个简单的使用例子,将枚举作为类方法的参数使用,代码如下:
**
+ (void)hpReadWeatherStateMsg:(HPTodayWeatherStateMsg)weatherStateMsg {
NSLog(@"字符串枚举值为-->%@",weatherStateMsg);
}
其实细心查看就会发现,字符串枚举的定义,和定义一个全局字符串常量一样,我们来看以下全局字符串常量的定义,先在HPStringEnum.h文件中添加以下代码:
**
/// Snowy:雪天
FOUNDATION_EXPORT NSString * const HPTodayWeatherStateMsgSnowy;
然后在HPStringEnum.m文件中赋值:
**
NSString * const HPTodayWeatherStateMsgSnowy = @"雪天";
我们现在回看一下上面定义字符串枚举的代码部分,发现不过是用HPTodayWeatherStateMsg替换了NSString *** 。而HPTodayWeatherStateMsg**就是通过以下这句代码:
/// 定义一个HPTodayWeatherStateMsg的字符串类型作为枚举类型
typedef NSString *HPTodayWeatherStateMsg NS_STRING_ENUM;
被我们定义为了**NSString *** 的别名。
关于NS_STRING_ENUM
在 Xcode 8 中,苹果为 Objective-C 提供了全新的 Macro: NS_STRING_ENUM 和 NS_EXTENSIBLE_STRING_ENUM,让这些字串常量使用起來更像是 Swift 原生的 string enum。
NS_STRING_ENUM 需要搭配 typedef 使用。首先使用之前先用 HPTodayWeatherStateMsg的作为 **NSString *** 的別名,并标记为 NS_STRING_ENUM,
接下来就如以下这样的代码去使用:
**
/// Sunny:晴天
FOUNDATION_EXPORT HPTodayWeatherStateMsg const HPTodayWeatherStateMsgSunny;
OK ,这就是字符串枚举的简单定义和使用了。
今天查看系统文件,看到了FOUNDATION_EXPORT这个修饰词,对于我这种初涉iOS编程的初学者来说,对于这个非常陌生,所以就上网搜了一下,原来FOUNDATION_EXPORT是用来定义常量的,我这里就用这篇文章记录整理一下我搜到的内容,给自己当作一个笔记。
FOUNDATION_EXPORT 与 #define 都可以用来定义常量
.h文件
**
FOUNDATION_EXPORT NSString *const kMyConstantString;
.m文件是这样定义的
**
NSString *const kMyConstantString = @"hello world";
另一种就是常用的#define 方法定义常量了
**
#define kMyConstantString @"Hello"
那么他们有什么区别呢?
使用FOUNDATION_EXPORT方法在检测字符串的值是否相等的时候效率更快.
可以直接使用(myString == MyFirstConstant)来比较, 而define则使用的是([myString isEqualToString:MyFirstContant])
哪个效率更高,显而易见了
第一种是直接比较指针地址
第二种则是一一比较字符串的每一个字符是否相等.