[iOS]详解枚举NS_ENUM与NS_OPTIONS的区别与说明

NS_ENUM与NS_OPTIONS区别与说明

我们根据两种定义常见的使用场景来说明其区别。
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;

你可能感兴趣的:(iOS开发)