美文网首页
枚举的定义

枚举的定义

作者: GShining | 来源:发表于2016-06-21 10:24 被阅读0次

    参考:http://blog.csdn.net/annkie/article/details/9877643

    一般情况下,我们采用C风格的enum关键字可以定义枚举类型:

    enum{

    UIViewAnimationTransitionNone,

    UIViewAnimationTransitionFlipFromLeft,

    UIViewAnimationTransitionFlipFromRight,

    UIViewAnimationTransitionCurlUp,

    UIViewAnimationTransitionCurlDown,

    } UIViewAnimationTransition;

    //位移操作枚举定义

    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的头文件,可以看到大量的枚举定义。

    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中:

    #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

    将:typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {

    展换到

    typedef enum UIViewAnimationTransition : NSInteger UIViewAnimationTransition;

    enum UIViewAnimationTransition : NSInteger {

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

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

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

    等效于上述定义。

    相关文章

      网友评论

          本文标题:枚举的定义

          本文链接:https://www.haomeiwen.com/subject/awcgdttx.html