顾名思义:NS_OPTIONS是多选项,NS_ENUM是单选项
那么问题来了,具体编译器是如何做到多选的呢?
我们以一个学生选课为例来了解具体的原理
1.学生有性别,男或女,那么我们用NS_ENUM来描述性别
2.学生可以选课,也可以取消选课,那么选课我们就用NS_OPTIONS来描述选课
1. NS_OPTIONS一般定义为NSUInteger,也就是long类型,存储方式为 0000 0000 0000 0001
//课程类型
typedef NS_OPTIONS(NSInteger, LessonOptions) {
LessonOptionsCsharp =1<<0, //0000 0000 0000 0001
LessonOptionsDatabase =1<<1, //0000 0000 0000 0010
LessonOptionsC =1<<2, //0000 0000 0000 0100
LessonOptionsCpp =1<<3, //0000 0000 0000 1000
LessonOptionsJava =1<<4, //0000 0000 0001 0000
};
2.NS_ENUM同C语言中的enum,即int类型的数据
//性别
typedef NS_ENUM(NSInteger,Sex){
SexMale, //默认0
SexFemale, //1
} ;
3.选课
-(void)chooseLessons:(LessonOptions)lessons{
self.lessons|= lessons;
}
4.取消选课
-(void)quitLessons:(LessonOptions)lessons{
self.lessons&= ~lessons;
}
验证:
#import "Student.h"
int main(int argc,const char* argv[]) {
@autoreleasepool{
Student*zs = [Student new];
[zs chooseLessons:LessonOptionsCsharp|LessonOptionsCpp|LessonOptionsJava|LessonOptionsDatabase];
NSLog(@"选课后,%@",zs);
[zs quitLessons:LessonOptionsCsharp|LessonOptionsCpp|LessonOptionsJava];
NSLog(@"取消选课后,%@",zs);
}
return 0;
}
控制台输出的内容为:
选课后,我叫张三,性别男,我选择的课程有:<数据库><C++><C#><Java>
取消选课后,我叫张三,性别男,我选择的课程有:<数据库>
总结:
大家仔细看一下选课和取消选课两个方法,编译器在展开NS_OPTIONS的时候,实际上是对NS_OPTIONS进行的位运算,通过位运算实现的多选