我在Xcode5中使用clang对以下代码进行了预处理。
typedef NS_ENUM(NSInteger, MyStyle) {
MyStyleDefault,
MyStyleCustom
};
typedef NS_OPTIONS(NSInteger, MyOption) {
MyOption1 = 1 << 0,
MyOption2 = 1 << 1,
};还有这个。
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++编译器)。
// 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,我无法测试这到底是为了什么。
发布于 2014-01-27 15:23:33
枚举和位掩码之间有一个基本的区别(选项)。您可以使用枚举来列出独占状态。当多个属性同时应用时,将使用位掩码。
在这两种情况下,您都使用整数,但您对它们的看法不同。使用枚举,您可以查看数值,使用位掩码,您可以查看单个位。
typedef NS_ENUM(NSInteger, MyStyle) {
MyStyleDefault,
MyStyleCustom
};只代表两个州。您可以简单地通过测试是否相等来检查它。
switch (style){
case MyStyleDefault:
// int is 0
break;
case MyStyleCustom:
// int is 1
break;
}而位掩码将表示更多的状态。您可以使用逻辑运算符或按位运算符检查各个位。
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
};博士给数字起了名字。位掩码给位的名称。
发布于 2013-09-23 15:22:29
唯一的主要区别是,使用适当的宏可以更好地进行类型检查和代码完成(Xcode的代码完成)。例如,NS_OPTIONS允许编译器确保将|放在一起的所有枚举都是相同类型的。
有关进一步阅读,请参阅:options/
编辑:
既然Swift即将到来,强烈推荐使用NS_ enum /OPTIONS,这样就可以正确地将枚举桥接成一个快速枚举。
发布于 2013-09-23 15:21:45
唯一的区别是让使用这些值的开发人员知道在OR'ed位掩码中使用这些值是否有意义。
编译器并不关心您使用哪个编译器:)
https://stackoverflow.com/questions/18962925
复制相似问题