zoukankan      html  css  js  c++  java
  • iOS

    一般情况下,我们采用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; 

    等效于上述定义。

  • 相关阅读:
    HDOJ 1069_大二写
    HDOJ 2037:今年暑假不AC_大二写
    第二次HDOJ:1058
    HDOJ 1019
    第二次 HDOJ 1003
    第二次做HDOJ 1051
    memset()的用法
    数据结构中的频度含义
    程序框图的书写
    python课堂整理22----装饰器进阶
  • 原文地址:https://www.cnblogs.com/baitongtong/p/5961817.html
Copyright © 2011-2022 走看看