1. 程式人生 > >Objective-C 列舉的使用

Objective-C 列舉的使用

概述

 在C、C++、Java這些語言中就有它們對應的列舉,定義的方式也多種多樣,但使用目的只有一個:讓程式碼可讀性更強。這裡我們只簡單說說Objective-C中列舉的使用。

在Apple提供給我們的API中,經常會看到使用列舉的例子:

有這樣的:

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};

還有這樣的:
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
};

可以看到在Objective-C中為我們提供了兩種定義巨集的列舉:NS_ENUM 和 NS_OPTIONS,這兩者其實本質上是一樣的,都是用來宣告列舉的,不過細小的區別還是有的。

NS_ENUM:常用來宣告一般的NSInteger型別的列舉。

NS_OPTIONS:常用來宣告NSUinteger型別的明位掩碼(bitmasked)。

說明:用enum就可以宣告一般型別和位掩碼型別,但是蘋果官方建議我們使用NS_ENUM 和 NS_OPTIONS,它們可以推斷出不同型別的列舉,還可以適配到不同的開發平臺。

NS_OPTIONS

我們重點看看NS_OPTIONS型別的列舉:

在NS_OPTIONS型別的列舉中,我們看到每個列舉值後有“ <<”,其實這就是左移位運算子,這樣我們就可以通過“|”(或位運算子)進行組合使用,a << b就表示把a轉化為二進位制後左移b位。

使用場景:如果一個列舉變數可能代表多個列舉值的時候,我們就需要宣告成NS_OPTIONS型別的列舉。其原理只是把各個列舉值加起來(轉化成十進位制再想加),獲得一個新值(十進位制)。我們知道列舉值相對唯一,位運算就很好的解決了這個問題,它可以確保列舉值組合在一起的唯一性。

那麼蘋果官方是怎麼知道我們多個條件組合使用了呢?答案是通過&(與位運算子)進行判斷的:

   
    NSUInteger controlEvents = UIControlEventEditingDidBegin | UIControlEventValueChanged | UIControlEventEditingDidEnd;
    
    if (controlEvents & UIControlEventEditingDidBegin) {
        NSLog(@"UIControlEventEditingDidBegin");
    } else if (controlEvents & UIControlEventValueChanged) {
        NSLog(@"UIControlEventValueChanged");
    } else if (controlEvents & UIControlEventEditingDidEnd) {
        NSLog(@"UIControlEventEditingDidEnd");
    }


在這裡我舉例說明NS_OPTIONS型別列舉的用法:
typedef NS_OPTIONS(NSUInteger, MyType) {
    MyTypeA = 1 << 0, //值為1,2的0次方
    MyTypeB = 1 << 1, //值為2,2的1次方
    MyTypeC = 1 << 2, //值為4,2的2次方
    MyTypeD = 1 << 3, //值為8,2的3次方
};

    NSUInteger value = MyTypeA | MyTypeB;
    
    NSLog(@"%zd, %zd, %zd, %zd", value & MyTypeA, value & MyTypeB, value & MyTypeC, value & MyTypeD);

    // 輸出結果:1, 2, 0, 0

這裡我們再通過二進位制解釋一下:

     轉化成二進位制:
     
     MyTypeA: 0 0 0 1
        |
     MyTypeB: 0 0 1 0
        |
     MyTypeC: 0 1 0 0
        |
     MyTypeD: 1 0 0 0
     ----------------
     value  : 1 1 1 1
     
     ps:以上的結果是通過|得到value的值(|的意思是隻要有一個為1,結果就為1)
     
     value  : 1 1 1 1
        &
     MyTypeA: 0 0 0 1
     ----------------
     結果值:   0 0 0 1
     
     ps:0001就是MyTypeA的值

從結果可以看出:1是MyTypeA的值,2是MyTypeB的值,其它列舉值沒有參與組合使用,值都為0。這也說明,如果value & MyTypeC的值為0,說明value不包含MyTypeC,反之亦然。

相關推薦

Objective-C 列舉的使用

概述  在C、C++、Java這些語言中就有它們對應的列舉,定義的方式也多種多樣,但使用目的只有一個:讓程式碼可讀性更強。這裡我們只簡單說說Objective-C中列舉的使用。 在Apple提供給我們的API中,經常會看到使用列舉的例子: 有這樣的: typedef NS

Objective-C列舉型別詳解

最近看了一本OC進階的書,很多人推薦的Effective Objictive-C2.0,看到書中列舉型別的介紹,覺得很不錯,這裡為大家總結一下。 enum 由於Objective-C基於C語言,所以C語言有的功能它都有,其中之一就是列舉型別enum。列舉

Objective-C 列舉型別和字串互轉方案

列舉型別的使用優勢沒啥好說的。但經常需要將它與字串進行轉換方便顯示或其它需求。 在常見的方案中,多是先宣告,然後在實現檔案裡建立一個對映表。這樣帶來的問題就是要分兩個檔案來管理,帶來管理不方便不好。使用前還在確保對映表已經初始化。顯然使用時還是有些許難受。 如果全部改用巨集

Objective-C 列舉 中位運算 的使用

前言 Enum,也就是列舉,從C語言開始就有了,C++、Java、Objective-C、Swift這些語言,當然都有對應的列舉型別,功能可能有多有少,但是最核心的還是一個—-規範的定義程式碼中的狀態、選項等“常量”。  Use Enumerations for St

Objective C轉Swift注意事項(一)合理使用結構體,列舉,extensions

前言 14年Swift剛出的時候開始學習的Swift,後來由於專案需要,一直寫App還是用的OC。最近打算把Swift重新撿起來,這個Objective C轉Swfit系列就當成是我的複習筆記,順便寫成部落格記錄下來吧。 這個系列不是講解Swift基礎,主要

Objective-C——OC中列舉的使用

OC中列舉的使用 前言 由於Objective-C是C語言的超集,所以在OC程式中一般的常量表示也有巨集定義   以及const 變數型別 變數 和列舉等形式,這裡我們介紹些列舉的幾種適用場合 用列舉表示一個操作的不同狀

Objective-C中將列舉轉換成NSString的一種思路

Objective-C中經常需要將列舉轉換成對應的字串型別。 這裡提供一種思路,可以少寫很多程式碼。 靈活利用C巨集中的#來字串化操作。(#在C中表示將之後的傳入引數當作字串處理,相當給引數左右加了“”) #define ENUM_TO_CSTR_CASE(enumTyp

Objective-C 執行AppleScript腳本

url alloc use 文件中 path str lee nss app 在Objective-C裏事實上也能夠執行AppleScript 第一種方式是Source 將腳本寫到變量字符串裏 NSAppleEventDescriptor *eventDescr

Swift、Objective-C 單例模式 (Singleton)

app 賦值 uil imp ide 效果 func instance 發現 本文的單例模式分為嚴格單例模式和不嚴格單例模式。單例模式要求一個類有一個實例,有公開接口可以訪問這個實例。嚴格單例模式,要求一個類只有一個實例;不嚴格單例模式,可以創建多個實例。 有的類只能有一個

Using Swift with Cocoa and Objective-C下載

target cocoa 下載地址 obj swift nbsp 地址 bject uil 《Using Swift with Cocoa and Objective-C Building App 》 下載地址 http://download.csdn.net/

Objective-C 中的Runtime的詳細使用

enc ring 博客 document 每次 tps htm lec guid Runtime全面了解 一直以來,OC被大家冠以動態語言的稱謂,其實是因為OC中包含的runtime機制。Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iO

Swift和Objective-C混合編程——Swift調用OC

分享 發現 load 另一個 == 方法 代碼 swift 應用 在iOS應用的開發中。Swift必將代替OC,兩者的趨勢是“短期共存,長期代替”。但曾經有太多的代碼是用OC語言完畢的,而Swift的開發也從 OC中繼承了非常多的特性。兩者也是有非常多的類

Objective-C之成魔之路【8-訪問成員變量和屬性】

order 線程安全 ring 內容 時間 targe 簡化 音樂 blank 郝萌主傾心貢獻,尊重作者的勞動成果。請勿轉載。 假設文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數額任意,重在心意^_^ 我要捐贈: 點擊捐贈 Cocos2d-X源代碼

Swift,Objective-C語言性能對照測試

popu ref span ngs htm post 沒有 接受 string 原文發表於踏得網Swift包括了非常多現代語言特性尤其是從一些腳本語言如Javascript/Ruby中汲取了營養。此外蘋果公布Swift時,使用特別選用的一些樣例來宣稱Swift性能對於Oj

objective-c 中數據類型之四 字典(NSDictionary)

bject ted ray 初始化 -c lec com lock led // 1. 字典初始化、賦值方式1 NSMutableDictionary *m_dictionary = [[NSMutableDictionary alloc] initWithCa

第 1 條:了解 Objective-C 語言的起源

還在 特性 只知道 程序 開發 不能 核心 nbsp 原因   馬上就要發布 Swift 4 了,自己也在學習 Swift,後面 iOS 編程估計也快是 Swift 的天下了,我卻還在這抱著一本講 OC 的書在啃,怪只能怪自己之前太懶了,按定價好幾十塊錢買的書不讀完,簡直對

objective-c 中數據類型之二 字符串(NSString)

option 大小 edas 字符串長度 seq scan 後者 code form // 1. 聲明一個NSString對象,註意對象前要加‘*’。 NSString *string1; // 賦值方

Objective-C - NSInteger轉換NSString

cast you 字符 instr pen compile ber 技術 exclusive NSInteger不是對象, 轉換為long匹配64位系統, 再組成字符串(%ld). NSString *inStr = [NSString strin

Swift 4 和 Objective-C 混合編程(一) 快速起步

命名方式 import 編譯器 選擇性 工程 Swift 4 和 Objective-C 在同一個工程裏的混搭編程的方法你可以在 xcode 裏同時使用 Swift 和 Objective-C(以下簡稱OC)來寫代碼,混搭編程的好處很多,比如允許大量代碼的復用,在性能和開發效率之間找到平衡

objective-c訪問控制符

mod ont 生成 外部 ble 外部程序 data char prot objective-c中成員變量的四個訪問控制符: @private:僅僅有當前類的內部才幹訪問 @public:全部人都可訪問 @pr