您的位置:首页 > 移动开发 > IOS开发

iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS

2015-03-23 10:29 302 查看
一般情况下,我们采用C风格的enum关键字可以定义枚举类型。

[cpp] view
plaincopy

enum{   

    UIViewAnimationTransitionNone,  

    UIViewAnimationTransitionFlipFromLeft,  

    UIViewAnimationTransitionFlipFromRight,  

    UIViewAnimationTransitionCurlUp,  

    UIViewAnimationTransitionCurlDown,  

} UIViewAnimationTransition;  

[cpp] view
plaincopy

//位移操作枚举定义  

enum {  

    UIViewAutoresizingNone                 = 0,  

    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  

    UIViewAutoresizingFlexibleWidth        = 1 << 1,  

    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  

    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  

    UIViewAutoresizingFlexibleHeight       = 1 << 4,  

    UIViewAutoresizingFlexibleBottomMargin = 1 << 5  

};  

typedef NSUInteger UIViewAutoresizing;//使用NSUInteger的地方可以使用UIViewAutoresizing,//UIViewAutoresizing相当于NSUInteger的一个别名使用。  

//因此一个UIViewAutoresizing的变量可以直接赋值给NSUInteger  

枚举值一般是4个字节的int值,在64位系统上是8个字节。
在iOS6和Mac OS 10.8以后Apple引入了两个宏来重新定义这两个枚举类型,实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分。

NS_OPTIONS一般用来定义位移相关操作的枚举值,我们可以参考UIKit.Framework的头文件,可以看到大量的枚举定义。

[cpp] view
plaincopy

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  

    UIViewAnimationTransitionNone,//默认从0开始  

    UIViewAnimationTransitionFlipFromLeft,  

    UIViewAnimationTransitionFlipFromRight,  

    UIViewAnimationTransitionCurlUp,  

    UIViewAnimationTransitionCurlDown,  

};  

  

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  

};  

这两个宏的定义在Foundation.framework的NSObjCRuntime.h中:

[cpp] view
plaincopy

#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  



[cpp] view
plaincopy

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  

 展开得到:

[cpp] view
plaincopy

typedef enum UIViewAnimationTransition : NSInteger UIViewAnimationTransition;  

enum UIViewAnimationTransition : NSInteger {  

从枚举定义来看,NS_ENUM和NS_OPTIONS本质是一样的,仅仅从字面上来区分其用途。NS_ENUM是通用情况,NS_OPTIONS一般用来定义具有位移操作或特点的情况(bitmask)。

实际使用时,可以直接定义:

[cpp] view
plaincopy

typedef enum : NSInteger {....} UIViewAnimationTransition;  

等效于上述定义。

参考文档:

1. http://nshipster.com/ns_enum-ns_options/

2.http://iamthewalr.us/blog/2012/11/ns_enum-and-ns_options/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: