其实枚举在日常开发中我们已经使用很多了,也就不多做一些教学类的介绍。
分享一下我在书中学习到的关于枚举的新知识。
typedef
比如网络加载状态枚举,没有typedef的情况下,我们这样写枚举:
enum FHNetWorkLoadState{
FHNetWorkLoadStateNone = 0,
FHNetWorkLoadStateLoading,
FHNetWorkLoadStateFinish
};
这样在后续使用中就会带来比较多的麻烦,要声明一个枚举类型的值,我们只能这么写:
enum FHNetWorkLoadState loadState = FHNetWorkLoadStateFinish;
显得多余很不方便。
此时使用typedef enum的好处就凸显出来。
我的理解是,typedef关键字可以将枚举声明称一个“类”,当然不是真的类。然后我们就可以更广泛的去使用枚举值,包括函数的参数,返回值,switch语句等。
NS_OPTIONS
我们经常可以在iOS框架中看到一些特殊的枚举类采用位操作来表示。如下:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
位操作的介绍就不多说了。还是关注一下NS_OPTIONS 关键字
与NS_OPTIONS 相对的还有NS_ENUM,两者的差别在于枚举的类型,也就是该枚举类型能否支持位操作。
在UIKit的框架中,可以找到一个系统定义的宏:
#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
#if (__cplusplus)
#define NS_OPTIONS(_type, _name) _type _name; enum : _type
#else
#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
#endif
#else
#define NS_ENUM(_type, _name) _type _name; enum
#define NS_OPTIONS(_type, _name) _type _name; enum
#endif
之所以苹果要写这样大量包含IF的宏,原因主要是以下:
检查编译器是否完全支持新类型的宏。如果编译器不支持位操作的NS_OPTION,那么自动转为NS_ENUM。
总结
- 1 使用枚举的时候名称的可读性要强。
- 2 多使用NS_OPTIONS 和NS_ENUM关键字。
网友评论