美文网首页iOS技术专题iOS开发iOS进阶指南
iOS两种枚举类型的区别NS_OPTIONS、NS_ENUM

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

作者: soulDxl | 来源:发表于2016-11-11 10:36 被阅读142次
通过查看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的枚举值同时多选使用的时候,能保证得到相加结果是唯一的。

参考博客

不足的地方,望指出😀

相关文章

网友评论

    本文标题:iOS两种枚举类型的区别NS_OPTIONS、NS_ENUM

    本文链接:https://www.haomeiwen.com/subject/aaffpttx.html