OC中NS_ENUM和NS_OPTIONS的区别和用法

2017-11-23  本文已影响0人  define南拳

顾名思义: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进行的位运算,通过位运算实现的多选

上一篇 下一篇

猜你喜欢

热点阅读