OC中的列舉型別

2021-07-11 03:48:31 字數 2641 閱讀 5485

一直對oc中的位移操作列舉

不太理解,查詢到兩篇介紹oc中列舉的文章,覺得很不錯。

什麼是位移操作列舉呢?

typedef ns_options(nsuinteger, uiviewautoresizing) ;

1.2.

列舉值一般是4個位元組的int值,在64位系統上是8個位元組。它不參與記憶體的占用和釋放,列舉定義變數即可直接使用,不用初始化。

在**中使用列舉的目的只有乙個,那就是增加**的可讀性。

enum uiviewanimationtransition;

//位移操作列舉定義  

enum ;

typedef nsuinteger uiviewautoresizing;

//使用nsuinteger的地方可以使用uiviewautoresizing,

//uiviewautoresizing相當於nsuinteger的乙個別名使用。

//因此乙個uiviewautoresizing的變數可以直接賦值給nsuinteger

typedef ns_enum(nsinteger, uiviewanimationtransition) ;  

typedef ns_options(nsuinteger, uiviewautoresizing) ;

這兩個巨集的定義在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, uiviewanimationtransition)  uiviewanimationtransition;

那就是乙個列舉變數可能要代表多個列舉值的時候。例如:

- (uiinte***ceorientationmask)supportedinte***ceorientations

上面uiinte***ceorientationmask 一定是個位移操作列舉。

其實給乙個列舉變數賦予多個列舉值的時候,原理只是把各個列舉值加起來罷了.

當加起來以後,就獲取了乙個新的值,那麼為了保證這個值的唯一性,這個時候就體現了位運算的重要作用.

位運算可以確保列舉值組合的唯一性.

因為位運算的計算方式是將二進位制轉換成十進位制,也就是說,列舉值裡面訪問的是 計算後的十進位制值。

typedef ns_options(nsinteger, test)  

;

通過上面的位運算方式設定好列舉以後,列印出來的列舉值分別是: 1 2 4 8 16

這5個數字,無論你如何組合在一起,也不會產生兩個同樣的數字.

多列舉值 賦值方式如下:

test tes = (testa|testb);
判斷列舉變數是否包含某個固定的列舉值,使用前需要確保列舉值以及各個組合的唯一性:

test tes = (testa|testb);

nslog(@"%ld",(long)tes);

nslog(@"%u",(tes & testa));

if ((tes & testa)) else

nslog(@"%u",(tes & testc));

if ((tes & testc)) else

也可以隨時為列舉變數累加某個值

tes |=testc;
注意:但是要自己控制不要新增已經加入過的列舉值, 列舉變數的值不會有變動,但這樣將會誤導閱讀**的人

有累加,自然有累減了

tes^= teste;
注意:如果累減不存在的列舉值, 那麼本次累減的列舉值,會自動累加上去.

OC中的列舉

oc中的列舉typedef enumtest 列舉名稱typedef ns enum nsinteger,test 結構比較清晰 推薦 typedef ns enum nsinteger,test 當乙個列舉變數可能要代表多個列舉值的時候,其實給乙個列舉變數賦予多 個列舉值的時候,原理知識把各個列舉...

oc中的列舉

如果乙個變數只有幾種可能的值,比如星期有幾天,一年有幾個季節等。這個時候可以用列舉變數。先定義型別再定義變數,如 enum siji 也可以定義匿名 enum yiyue,siyue 這裡列出列舉的值,順序從0開始,以此類推 oc允許將整數賦值給列舉變數。我們定義乙個類,來實現列舉的賦值和對比,順便...

oc中結構體和列舉型別

1.列舉型別 推薦的定義列舉型別的方式 typedef ns enum nsinteger,rwtleftmenutopitemtype typedef ns enum nsinteger,rwtglobalconstants 不推薦的方式 enum globalconstants 2.結構體 1....