美文网首页
NS_ENUM 和 NS_OPTIONS

NS_ENUM 和 NS_OPTIONS

作者: LeeJay | 来源:发表于2017-06-14 15:15 被阅读165次

    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

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