在軟體開發中,列舉是我們會經常會用到的一種程式設計方式,通過列舉,可以使我們的**更具可讀性與統一性。通常情況下,我們會通過typedef來定義一種列舉的型別來使用。例如:?
12
3
4
5
typedef
enum
myenum;
我們可以在函式的引數中來使用它:?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-(
void
)testeunm:(myenum)para
break
;
case
para2:
break
;
case
para3:
break
;
default
:
break
;
}
}
我們在呼叫呼叫這樣的乙個函式的時候,通過傳入乙個列舉型別,可以分流執行我們想要的操作。
列舉並不是一種奇怪的型別,起實質是整型的另乙個名字,如果沒有附加的操作,列舉中的第乙個引數預設就是整型0,之後依次遞加,當然,我們也可以認為的控制這個數值,例如: ?
12
3
4
5
typedef
enum
myenum;
可以這麼理解,我在傳參的時候,傳7和para1是完全一樣的效果,但是後者明顯更具可讀性。
如果熟悉ios的開發,你會發現系統很多的列舉型別都是可以複選的,例如檢視的拉伸模式,json的解析屬性等等,這不僅使**可讀性優化,也更加簡便了一些選項設定的**。當我們理解了列舉就是整型之後,會發現其實很容易做到這一點:
首先,我們給定義的列舉引數設定乙個有規律的值: ?
12
3
4
5
typedef
enum
myenum;
《符號是位運算中的左移運算子,將1進行1位,2位,3位的左移後,我們得到的二進位制數如下:?
12
3
0001
0010
0100
現在我們有了乙個大致思路了,用當前位的0和1來標識當前屬性是否設定,如果有幾個屬性的複選,只需要將我們的相應列舉進行或的位運算,在取的時候檢測相應位是否為1即可,這正是與運算可以做到的:?
12
3
4
5
6
7
8
9
10
11
-(
void
)testeunm:(myenum)para
if
(para&1<<2)
if
(para&1<<3)
}
我們通過如下方式呼叫:?
1[self testeunm:para2|para3];
列印結果如下:
這種位運算的列舉在官方sdk中被廣泛使用,能夠有效的簡化**和提高**的可讀性。
Objective C位運算子 一次求反運算子
一次求反運算子是一元運算子,它的作用僅是對運算數的位 翻轉 將運算數的每個是1的位翻轉為0,而將每個是0的位翻轉為1。下面是真值表 b1 b1 0 1 1 0 如果不知道運算中數值的準確位大小,那麼一次求反運算子非常有用,使用它可讓程式不會依賴於整數資料型別的特定大小。例如,要將型別為int的w1的...
Objective C中的位運算子用法
符號運算 按位與 按位或 按位異或 一次求反 向左移位 向右移位 表中列出的所有運算子,除一次求反運算子 外,都是二元運算子,因此需要兩個運算數。位運算子可處理任何型別的整型值,但不能處理浮點值。1 按位運算子 對兩個值執行與運算時,會逐位比較兩個值的二進位制表示。第乙個值與第二個值對應位都為1時,...
Objective C中的位運算子用法
符號運算 按位與 按位或 按位異或 一次求反 向左移位 向右移位 表中列出的所有運算子,除一次求反運算子 外,都是二元運算子,因此需要兩個運算數。位運算子可處理任何型別的整型值,但不能處理浮點值。1 按位運算子 對兩個值執行與運算時,會逐位比較兩個值的二進位制表示。第乙個值與第二個值對應位都為1時,...