我们根据两种定义常见的使用场景来说明其区别。
NS_ENUM
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,//默认从0开始
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown
};
说明:
NS_ENUM 的第一个参数是用于存储的新类型的类型。在64位环境下,UIViewAnimationTransition和 NSInteger 一样有8bytes长。你要保证你给出的所有值能被该类型容纳,否则就会产生错误。第二个参数是新类型的名字。大括号里面和以前一样,是你要定义的各种值。
一般枚举项加上后缀以视区别,大括号中的枚举项的值默认是从0开始连续递增,可自定义,若是定义了枚举项其中一项的值后面依次在它的前一项的值上加1,如这样:
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone=0, //值为0
UIViewAnimationTransitionFlipFromLeft, //值为1
UIViewAnimationTransitionFlipFromRight,//值为2
UIViewAnimationTransitionCurlUp, //值为3
UIViewAnimationTransitionCurlDown //值为4
};
或
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone=0, //值为0
UIViewAnimationTransitionFlipFromLeft=2, //值为2
UIViewAnimationTransitionFlipFromRight,//值为3
UIViewAnimationTransitionCurlUp, //值为4
UIViewAnimationTransitionCurlDown //值为5
};
当然也可以简写为如下写法,但是不推荐。
typedef enum {
UIViewAnimationTransitionNone,//默认从0开始
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown
}UIViewAnimationTransition;
NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionNone = 0, //值为0
UISwipeGestureRecognizerDirectionRight = 1 << 0, //值为2的0次方
UISwipeGestureRecognizerDirectionLeft = 1 << 1, //值为2的1次方
UISwipeGestureRecognizerDirectionUp = 1 << 2, //值为2的2次方
UISwipeGestureRecognizerDirectionDown = 1 << 3 //值为2的3次方
};
enum 也可以被定义为按位掩码(bitmask)。用简单的OR (|)和AND (&)数学运算即可实现对一个整型值的编码。每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 0、 1 << 1、 1 << 2等。如果你能够心算出每个数字的二进制表示法,例如:10110 代表 22,每一位都可以被认为是一个单独的布尔值。例如在UIKit中, UISwipeGestureRecognizerDirection就是一个可以表示任何right、left、up 或down组合的位掩码。
不像 NS_ENUM ,位掩码用 NS_OPTIONS 宏。
语法和 NS_ENUM 完全相同,但这个宏提示编译器值是如何通过位掩码 | 组合在一起的。同样的,注意值的区间不要超过所使用类型的最大容纳范围。小括号中第一个为NSUInteger这个为固定值,第二个为自定义的枚举类型,枚举项后面再跟上几个值的区别,这里枚举项是NSUInteger类型,一般用来定义位移相关操作。
类似的,这个也可以简写为:
typedef enum {
UISwipeGestureRecognizerDirectionNone = 0, //值为0
UISwipeGestureRecognizerDirectionRight = 1 << 0, //值为2的0次方
UISwipeGestureRecognizerDirectionLeft = 1 << 1, //值为2的1次方
UISwipeGestureRecognizerDirectionUp = 1 << 2, //值为2的2次方
UISwipeGestureRecognizerDirectionDown = 1 << 3 //值为2的3次方
}UISwipeGestureRecognizerDirection;