iOS两种枚举类型的区别NS_OPTIONS、NS_ENUM

通过查看UIKit.Framework里的文件,我们可以看到系统枚举的一些写法。

方式一:NS_ENUM

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    UIViewAnimationCurveEaseInOut,         // slow at beginning and end
    UIViewAnimationCurveEaseIn,            // slow at beginning
    UIViewAnimationCurveEaseOut,           // slow at end
    UIViewAnimationCurveLinear,
};

方式二:NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

从直观上看来,方式二后面似乎多了一些符号1<<0....这些,先说一下这个“<<”,这个是 右移运算符,是移位运算符中的一种,不太了解的可以这里了解一下
从命名上来看,options似乎是可以多选的意思,再结合一下<<运算,1<<0、1、2、3、4....这些枚举值任意结合也不会有重复的数值。这样大概就明白了这样做的目的、原因。

理一下:

iOS使用两种方式定义的目的是区分使用场景:是否可以"多选"。NS_ENUM多使用在互斥的环境下,而NS_OPTIONS多使用在可多选的环境下。

在系统API中可以看到NS_OPTIONS定义的枚举都采用了位运算作为枚举内容,而NS_ENUM则没有,这样做的原因就是NS_OPTION的枚举值同时多选使用的时候,能保证得到相加结果是唯一的。

参考博客

不足的地方,望指出😀

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容