已被此妹萌哭,好了,廢話不多說,進入正題,今天介紹一下objective-c中的枚舉
提要
首先要知道的是,枚舉值 它是一個整形(int) 并且,它不參加內存的占用和釋放 枚舉定義變量即可直接使用,不用初始化
-
三種類型的枚舉
- enum 在iOS6之前一般我們采用C風格的enum關鍵字可以定義枚舉類型
在iOS6之后引入兩個宏來定義枚舉實際上是將enum定義和typedef合二為一,并且采用不同的宏來從代碼角度來區分。
- NS_ENUM 普通枚舉定義可參見UIKit.Framework中
- NS_OPTIONS 位運算及特殊枚舉的定義。什么時候要用到這種方式呢? 那就是一個枚舉變量可能要代表多個枚舉值的時候. 其實給一個枚舉變量賦予多個枚舉值的時候,原理只是把各個枚舉值加起來罷了. 當加起來以后,就獲取了一個新的值,那么為了保證這個值的唯一性,這個時候就體現了位運算的重要作用. 位運算可以確保枚舉值組合的唯一性. 因為位運算的計算方式是將二進制轉換成十進制,也就是說,枚舉值里面存取的是 計算后的十進制值. 打個比方: 通過上面的位運算方式設定好枚舉以后,打印出來的枚舉值分別是: 1 2 4 8 16 這5個數字,無論你如何組合在一起,也不會產生兩個同樣的數字.
這兩個宏的定義在Foundation.framework的NSObjCRuntime.h中:
#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
#if (__cplusplus)
#define NS_OPTIONS(_type, _name) _type _name; enum : _type
#else
#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
#endif
#else
#define NS_ENUM(_type, _name) _type _name; enum
#define NS_OPTIONS(_type, _name) _type _name; enum
#endif
舉個??
//推薦的定義枚舉類型的方式
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
RWTLeftMenuTopItemMain,
RWTLeftMenuTopItemShows,
RWTLeftMenuTopItemSchedule
};
typedef NS_ENUM(NSInteger, RWTGlobalConstants) {
RWTPinSizeMin = 1,
RWTPinSizeMax = 5,
RWTPinCountMin = 100,
RWTPinCountMax = 500
};
typedef NS_OPTIONS(NSInteger, Test) {
TestA = 1, //1 1 1等于號后面必須等于1
TestB = 1 << 1, //2 2 10 轉換成 10進制 2
TestC = 1 << 2, //4 3 100 轉換成 10進制 4
TestD = 1 << 3, //8 4 1000 轉換成 10進制 8
TestE = 1 << 4 //16 5 10000 轉換成 10進制 16
};
//不推薦的方式
enum GlobalConstants {
kMaxPinSize = 5,
kMaxPinCount = 500
};
共同學習共同進步,加油。fighting??