一直對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....