1、有符号、无符号
有符号:用最高为来表示符号位 , 1表示负,0表示正无符号:全部用来表示实际数。两者的取值范围不同有符号整型为 -32768 到 32767
无符号 (unsigned):整型 为 0 到 65535
2、NSUInteger、NSInteger
NSUInteger是无符号的整型,,在表视图应用中常见 NSUInteger row= [indexPath row];因为这是显示tableViewCell有多少个,只能是非零整数的,也就是说NSUInteger常用于索引值;
NSInteger是有符号的整型
3、NS_OPTIONS、NS_ENUM
NS_ENUM 定义通用枚举 枚举项的值为NSInteger,
NS_OPTIONS 定义位移枚举 枚举项的值为NSUInteger; ps:位移枚举即是在你需要的地方可以同时存在多个枚举值
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次方
};
typedef NS_ENUM(NSInteger, NSWritingDirection) {
NSWritingDirectionNatural = -1, //值为-1
NSWritingDirectionLeftToRight = 0, //值为0
NSWritingDirectionRightToLeft = 1 //值为1
};
UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
//这里几个枚举项同时存在表示它的方向同时包含1.向下2.向左3.向右
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionNatural; //而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项
4、 问题
问: 这里为什么会出现NS_OPTIONS与NS_ENUM且为什么不直接一个就行,且枚举值可多选
答:因为有个是否将代码按照C++模式编译,若是不按照C++模式编译,NS_OPTIONS与NS_ENUM展开方式就一样,若是要按照C++模式编译,就不同了。
在使用或运算操作两个枚举值时,C++默认为运算结果的数据类型是枚举的底层数据类型即NSUInteger,且C++不允许它隐式转换为枚举类型本身,所以C++模式 下定义了NS_OPTIONS宏以保证不出现类型转换。
到了这我们就知道了只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS,否则使用NS_ENUM。