通过查看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的枚举值同时多选使用的时候,能保证得到相加结果是唯一的。
不足的地方,望指出😀