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