NS_ENUM 和 NS_OPTIONS

Objective-C 里的枚举有两种类型:NS_ENUM 和 NS_OPTIONS,本质上是一样的,都是枚举。

NS_ENUM

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
};

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
};

NS_ENUM 这种声明出来的东西大部分是单选, NS_OPTIONS 声明出来的大部分是多选。

  1. 像 UITableViewCellStyle 这种在用的时候肯定是只能选一种样式,要么 style 是 Default,要么是 Subtitle 或者 Value1 或者 Value2 等等,你的 Cell 不可能既是 Default 类型,又是 Subtitle 类型。

  2. 但是 UIViewAutosizing 就不一样了。我要是让子视图的宽高和父视图一样,那么 autoviewsizing 的选项肯定是类似于这种。

UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight

意思就是两个 options 的我都得选才行。

那么如果有个场景让我判断当前的 View 的 Autoresizing 有哪几个,我怎么判断呢?

很简单,用按位与操作就行了。

autoResizings = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;

我们判断 autoResizings 里是否有 UIViewAutoresizingFlexibleLeftMargin 的时候只需要判断下面的是否为 true 就可以了。

// 是否为 true 就可以了
if (autoResizings & UIViewAutoresizingFlexibleLeftMargin)

Tips:有些语言并不像 Objective-C 非 0 即真,比如 Swift 等。(今天就遇到了这个小坑)

用二进制表示

UIViewAutoresizingFlexibleLeftMargin = 00000001
UIViewAutoresizingFlexibleWidth = 00000010
UIViewAutoresizingFlexibleRightMargin = 00000100

所以根据上面的表达式,我们的 autoResizings = 00000111,
那么执行按位与操作是这样的。

if (00000111 & 00000001)  

结果就是 00000001,为 true,表示含有这个选项。

参考文章

NS_ENUM & NS_OPTIONS

你可能感兴趣的:(NS_ENUM 和 NS_OPTIONS)