zoukankan      html  css  js  c++  java
  • NS_ENUM和NS_OPTIONS区别

      首先,NS_ENUM和NS_OPTIONS都是宏。 

      Foundation框架中定义了一些辅助的宏,用这些宏来定义枚举类型时,也可以指定用于保存枚举值的底层数据类型。这些宏具有向后兼容能力,如果目标平台的编译器支持新标准,那就使用新式语法,否则改用旧式语法。这些宏是用#define预处理指令来定义的。NS_ENUM 和 NS_OPTIONS的定义如下:

    #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用与判断编译器是否支持新式枚举。如果不支持,那么就使用老式语法来定义枚举。

      根据是否要将代码按C++模式编译,NS_OPTIONS宏的定义方式也有所不同。如果不按C++编译,那么其展开方式就和NS_ENUM相同。若按C++编译,则展开后的代码略有不同。原因在于,用按位或运算来操作两个枚举值时,C++编译模式的处理办法与非C++模式不一样。在用或运算操作两个枚举值时,C++认为运算结果的数据类型应该是枚举的底层数据类型,也就是NSUInteger,而且C++不允许将这个底层类型”隐式转换“为枚举类型本身,所以,在C++模式下应该用NS_OPTIONS宏,以便省去类型转换操作。

      所以,凡是需要以按位或操作来组合的枚举都应使用NS_OPTIONS定义。若是枚举不需要互相组合,则应使用NS_ENUM来定义。

     
  • 相关阅读:
    大数据学习——实现多agent的串联,收集数据到HDFS中
    大数据学习——flume拦截器
    Notepad++ 连接远程 FTP
    大数据学习——采集文件到HDFS
    How to Catch Ctrl-C in Shell Script
    Error: package or namespace load failed for ‘rJava’:
    Complex Instance Placement
    Linux 下 CPU 使用率与机器负载的关系与区别
    编码和加密算法介绍
    k8s sidecar, Ambassador, Adapter containers
  • 原文地址:https://www.cnblogs.com/wuqh-iOS/p/4861566.html
Copyright © 2011-2022 走看看