首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NS_ENUM和NS_OPTIONS有什么区别?

NS_ENUM和NS_OPTIONS有什么区别?
EN

Stack Overflow用户
提问于 2013-09-23 15:17:23
回答 4查看 22.2K关注 0票数 32

我在Xcode5中使用clang对以下代码进行了预处理。

代码语言:javascript
运行
复制
typedef NS_ENUM(NSInteger, MyStyle) {
    MyStyleDefault,
    MyStyleCustom
};

typedef NS_OPTIONS(NSInteger, MyOption) {
    MyOption1 = 1 << 0,
    MyOption2 = 1 << 1,
};

还有这个。

代码语言:javascript
运行
复制
typedef enum MyStyle : NSInteger MyStyle; enum MyStyle : NSInteger {
    MyStyleDefault,
    MyStyleCustom
};

typedef enum MyOption : NSInteger MyOption; enum MyOption : NSInteger {
    MyOption1 = 1 << 0,
    MyOption2 = 1 << 1,
};

我知道NS_OPTIONS是用于位掩码的,但是技术上有什么不同吗?还是这只是命名约定?

编辑

根据NS_OPTIONS的定义,它可能是为了编译器的兼容性(特别是对于c++编译器)。

代码语言:javascript
运行
复制
// In CFAvailability.h
// Enums and Options
#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
  #define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
  #if (__cplusplus)
    #define CF_OPTIONS(_type, _name) _type _name; enum : _type
  #else
    #define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
  #endif
#else
  #define CF_ENUM(_type, _name) _type _name; enum
  #define CF_OPTIONS(_type, _name) _type _name; enum
#endif

但是,clang中的__cplusplus值是199711,我无法测试这到底是为了什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-27 15:23:33

枚举和位掩码之间有一个基本的区别(选项)。您可以使用枚举来列出独占状态。当多个属性同时应用时,将使用位掩码。

在这两种情况下,您都使用整数,但您对它们的看法不同。使用枚举,您可以查看数值,使用位掩码,您可以查看单个位。

代码语言:javascript
运行
复制
typedef NS_ENUM(NSInteger, MyStyle) {
    MyStyleDefault,
    MyStyleCustom
};

只代表两个州。您可以简单地通过测试是否相等来检查它。

代码语言:javascript
运行
复制
switch (style){
    case MyStyleDefault:
        // int is 0
    break;
    case MyStyleCustom:
        // int is 1
    break;
}

而位掩码将表示更多的状态。您可以使用逻辑运算符或按位运算符检查各个位。

代码语言:javascript
运行
复制
typedef NS_OPTIONS(NSInteger, MyOption) {
    MyOption1 = 1 << 0, // bits: 0001
    MyOption2 = 1 << 1, // bits: 0010
};

if (option & MyOption1){ // last bit is 1
    // bits are 0001 or 0011
}
if (option & MyOption2){ // second to last bit is 1
    // bits are 0010 or 0011
}
if ((option & MyOption1) && (option & MyOption2)){ // last two bits are 1
    // bits are 0011
}

博士给数字起了名字。位掩码给位的名称。

票数 55
EN

Stack Overflow用户

发布于 2013-09-23 15:22:29

唯一的主要区别是,使用适当的宏可以更好地进行类型检查和代码完成(Xcode的代码完成)。例如,NS_OPTIONS允许编译器确保将|放在一起的所有枚举都是相同类型的。

有关进一步阅读,请参阅:options/

编辑:

既然Swift即将到来,强烈推荐使用NS_ enum /OPTIONS,这样就可以正确地将枚举桥接成一个快速枚举。

票数 17
EN

Stack Overflow用户

发布于 2013-09-23 15:21:45

唯一的区别是让使用这些值的开发人员知道在OR'ed位掩码中使用这些值是否有意义。

编译器并不关心您使用哪个编译器:)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18962925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档