typedef NS_ENUM
NS_ENUM 的第一個參數(shù)是用于存儲的新類型的類型且预。在64位環(huán)境下荧飞,UITableViewCellStyle 和 NSInteger 一樣有8bytes長。你要保證你給出的所有值能被該類型容納滓玖,否則就會產(chǎn)生錯誤(8個字節(jié)的長度很長啦坪哄,一般不會超過)。第二個參數(shù)是新類型的名字。大括號里面和以前一樣模暗,是你要定義的各種值念祭。
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 (&)數(shù)學(xué)運算即可實現(xiàn)對一個整型值的編碼晾剖。每一個值不是自動被賦予從0開始依次累加1的值钞瀑,而是手動被賦予一個帶有一個bit偏移量的值:類似1 << 0慷荔、 1 << 1、 1 << 2等贷岸。
語法和 NS_ENUM 完全相同磷雇,但這個宏提示編譯器值是如何通過位掩碼 | 組合在一起的。同樣的螟蒸,注意值的區(qū)間不要超過所使用類型的最大容納范圍崩掘。
typedef NS_OPTIONS(NSUInteger, UITableViewCellStateMask) {
UITableViewCellStateDefaultMask = 0, //其值0
UITableViewCellStateShowingEditControlMask = 1 << 0, //其值為2的0次方
UITableViewCellStateShowingDeleteConfirmationMask = 1 << 1 //其值為2的1次方
};
NS_OPTIONS的值可以同時存在,而NS_ENUM定義的枚舉不能幾個枚舉項同時存在苞慢,只能選擇其中一項
得出結(jié)論,需要值同時存在的時候就要用NS_OPTIONS绍赛, 不需要時用NS_ENUM就能滿足需求了。
總結(jié)此吗蚌,來源于對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
};