typedef NS_ENUM 和 typedef NS_OPT

2017-08-21  本文已影响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
};

上一篇下一篇

猜你喜欢

热点阅读