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