NS_ENUM与NS_OPTIONS区别与说明

原文地址

NS_ENUM与NS_OPTIONS区别与说明
我们根据两种定义常见的使用场景来说明其区别。 
NS_ENUM

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,//默认从0开始
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown
};
1
2
3
4
5
6
7
说明: 
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
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
当然也可以简写为如下写法,但是不推荐。

typedef enum {
    UIViewAnimationTransitionNone,//默认从0开始
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown
}UIViewAnimationTransition;
1
2
3
4
5
6
7
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次方
};
1
2
3
4
5
6
7
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;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值