美文网首页
typedef NS_ENUM 和 typedef NS_OPT

typedef NS_ENUM 和 typedef NS_OPT

作者: 落夏简叶 | 来源:发表于2017-08-21 15:52 被阅读404次

    typedef NS_ENUM

    NS_ENUM 的第一个参数是用于存储的新类型的类型。在64位环境下,UITableViewCellStyle 和 NSInteger 一样有8bytes长。你要保证你给出的所有值能被该类型容纳,否则就会产生错误(8个字节的长度很长啦,一般不会超过)。第二个参数是新类型的名字。大括号里面和以前一样,是你要定义的各种值。

    typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
        UITableViewCellStyleDefault,    // 0
        UITableViewCellStyleValue1,     // 1
        UITableViewCellStyleValue2,     // 2
        UITableViewCellStyleSubtitle    // 3
    }; 
    

    默认情况下,是从0开始,然后递增1的赋值,当然你也可以给其赋值

    typedef NS_ENUM(NSInteger, XXTableViewCellStyle) {
        XXTableViewCellStyleValue1 = 0,  //值为0    
        XXTableViewCellStyleValue2,  //值为1
        XXTableViewCellStyleSubtitle //值为2       
    };
    //或者这样
    typedef NS_ENUM(NSInteger, XXTableViewCellStyle) {
        XXTableViewCellStyleValue1 = 0,  //值为0    
        XXTableViewCellStyleValue2 = 2,  //值为2
        XXTableViewCellStyleSubtitle  //值为3       
    };
    

    typedef NS_OPTIONS

    不像 NS_ENUM ,位掩码用 NS_OPTIONS 宏。用简单的OR (|)和AND (&)数学运算即可实现对一个整型值的编码。每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 0、 1 << 1、 1 << 2等。
    语法和 NS_ENUM 完全相同,但这个宏提示编译器值是如何通过位掩码 | 组合在一起的。同样的,注意值的区间不要超过所使用类型的最大容纳范围。

    typedef NS_OPTIONS(NSUInteger, UITableViewCellStateMask) {
        UITableViewCellStateDefaultMask                     = 0,       //其值0
        UITableViewCellStateShowingEditControlMask          = 1 << 0,  //其值为2的0次方
        UITableViewCellStateShowingDeleteConfirmationMask   = 1 << 1   //其值为2的1次方
    };
    

    NS_OPTIONS的值可以同时存在,而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项

    得出结论,需要值同时存在的时候就要用NS_OPTIONS, 不需要时用NS_ENUM就能满足需求了。

    总结此,来源于对SDWebImage的源码解读。SDWebImageOptions 的值可以多选哦。

    typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
        /**
         * By default, when a URL fail to be downloaded, the URL is blacklisted so the library won't keep trying.
         * This flag disable this blacklisting.
         */
        SDWebImageRetryFailed = 1 << 0,
    
        SDWebImageLowPriority = 1 << 1,
    
        SDWebImageCacheMemoryOnly = 1 << 2,
    
        SDWebImageProgressiveDownload = 1 << 3,
    
        SDWebImageRefreshCached = 1 << 4,
    
        SDWebImageContinueInBackground = 1 << 5,
    
        SDWebImageHandleCookies = 1 << 6,
    
        SDWebImageAllowInvalidSSLCertificates = 1 << 7,
    
        SDWebImageHighPriority = 1 << 8,
        
        SDWebImageDelayPlaceholder = 1 << 9,
    
        SDWebImageTransformAnimatedImage = 1 << 10,
        
        SDWebImageAvoidAutoSetImage = 1 << 11,
    
        SDWebImageScaleDownLargeImages = 1 << 12
    };
    
    

    相关文章

      网友评论

          本文标题:typedef NS_ENUM 和 typedef NS_OPT

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