復(fù)選枚舉(位移枚舉)的實現(xiàn)邏輯

下面我們先來看看我們在開發(fā)中經(jīng)常使用的蘋果為我們提供的兩個枚舉值:

NS_ENUM

typedef NS_ENUM(NSInteger, UIButtonType) {
    UIButtonTypeCustom = 0,                         // no button type
    UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS(7_0),  // standard system button

    UIButtonTypeDetailDisclosure,
    UIButtonTypeInfoLight,
    UIButtonTypeInfoDark,
    UIButtonTypeContactAdd,
    
    UIButtonTypePlain API_AVAILABLE(tvos(11.0)) API_UNAVAILABLE(ios, watchos), // standard system button without the blurred background view
    
    UIButtonTypeRoundedRect = UIButtonTypeSystem   // Deprecated, use UIButtonTypeSystem instead
};

該類型的枚舉我們只能傳遞一個值,不能組合使用,比如:

UIButton *loginBtn = [UIButton buttonWithType:UIButtonTypeCustom];

關(guān)于這種枚舉沒有什么多說的,今天我們重點討論的是下面的這種枚舉以及實現(xiàn)方式

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

這種枚舉與上面的不同,在使用的時候我們可以組合使用,傳遞多個值 比如:

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;

那么不知道讀者有沒有想過這樣一個問題,我們傳遞了多個數(shù)據(jù),那么程序內(nèi)部是如何去判斷我們分別傳遞了那些值呢?

再具體的分析之前我們先來回憶一下 位運算的相關(guān)知識

|
如果兩個相應(yīng)的二進制位只要有一個是1低散,結(jié)果就是1;否則為0骡楼。
比如

  00000001
| 00000010
____________
  00000011

&
如果兩個相應(yīng)的二進制位都為1熔号,則該位的結(jié)果值為1;否則為0鸟整。
比如

    00000011            00000011                           00000011 

  & 00000001          & 00000010   &上一個之前不包含的數(shù)據(jù)=> & 00000100
  ____________       ______________                     ______________
    00000001            00000010                           00000000

通過上面的運算我們可以看到 通過 & 運算之后可以得到它本身.
也就是如果e = a| b | c | d引镊,那么e & a 、e & b 篮条、e & c 祠乃、 e & d都為true.
就是說你這個枚舉值包含了那些原始枚舉值,&操作值都為true.否則為false

<<
向左移一位兑燥,右邊自動補0
比如 1 << 1 = 2

  00000001 << 1

  00000010 = 2

所以通過上面的分析我們不難猜出位移枚舉的內(nèi)部判斷邏輯應(yīng)該是這樣的:

- (void)setOptions:(UIViewAutoresizing)options
{
    if (options & UIViewAutoresizingFlexibleWidth) {
        NSLog(@"包含了UIViewAutoresizingFlexibleWidth");
    }
    
    if (options & UIViewAutoresizingFlexibleHeight) {
        NSLog(@"包含了UIViewAutoresizingFlexibleWidth");
    }
    
    if (options & UIViewAutoresizingFlexibleTopMargin) {
        NSLog(@"包含了UIViewAutoresizingFlexibleWidth");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亮瓷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子降瞳,更是在濱河造成了極大的恐慌嘱支,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣饥,死亡現(xiàn)場離奇詭異除师,居然都是意外死亡,警方通過查閱死者的電腦和手機扔枫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門汛聚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人短荐,你說我怎么就攤上這事倚舀√究蓿” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵痕貌,是天一觀的道長风罩。 經(jīng)常有香客問我,道長舵稠,這世上最難降的妖魔是什么超升? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮哺徊,結(jié)果婚禮上室琢,老公的妹妹穿的比我還像新娘。我一直安慰自己落追,他們只是感情好盈滴,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淋硝,像睡著了一般雹熬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谣膳,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天竿报,我揣著相機與錄音,去河邊找鬼继谚。 笑死烈菌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的花履。 我是一名探鬼主播芽世,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诡壁!你這毒婦竟也來了济瓢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤妹卿,失蹤者是張志新(化名)和其女友劉穎旺矾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夺克,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡箕宙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铺纽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬帕。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陷寝,到底是詐尸還是另有隱情锅很,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布盼铁,位于F島的核電站粗蔚,受9級特大地震影響尝偎,放射性物質(zhì)發(fā)生泄漏饶火。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一致扯、第九天 我趴在偏房一處隱蔽的房頂上張望肤寝。 院中可真熱鬧,春花似錦抖僵、人聲如沸鲤看。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽义桂。三九已至,卻和暖如春蹈垢,著一層夾襖步出監(jiān)牢的瞬間慷吊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工曹抬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溉瓶,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓谤民,卻偏偏與公主長得像堰酿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子张足,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一. 單例模式簡介 單例模式的作用可以保證在程序運行過程触创,一個類只有一個實例,而且該實例易于供外界訪問從而方便地控...
    xx_cc閱讀 50,260評論 15 146
  • 原鏈接:http://www.reibang.com/p/4867dc92337e原作者:僅供我個人收藏學習为牍,原博...
    油菜花花花花閱讀 338評論 0 0
  • 單例模式作用 可以保證在程序運行過程中哼绑,一個類只有一個實例,而且該實例易于供外界使用 從而方便地控制了實例個數(shù)吵聪,并...
    珍此良辰閱讀 1,343評論 3 8
  • 1 單例模式 它是一種設(shè)計模式(常見的設(shè)計模式有:觀察者模式凌那、工廠模式、門面模式等)吟逝。單例設(shè)計模式中帽蝶,一個類只有一...
    歲與禾閱讀 921評論 5 9
  • 已失效,大家看個思路就好 爬取原因:Python新手,就是想了解一下Python工程師在北上廣等大中城市的薪資水平...
    Fretice閱讀 3,344評論 13 11