Objective C使用位運算設計可複選的列舉

2021-09-23 21:21:11 字數 2624 閱讀 1095

在軟體開發中,列舉是我們會經常會用到的一種程式設計方式,通過列舉,可以使我們的**更具可讀性與統一性。通常情況下,我們會通過typedef來定義一種列舉的型別來使用。例如:?

12

3

4

5

typedefenummyenum;

我們可以在函式的引數中來使用它:?

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;

casepara2:

break;

casepara3:

break;

default:

break;

}

}

我們在呼叫呼叫這樣的乙個函式的時候,通過傳入乙個列舉型別,可以分流執行我們想要的操作。

列舉並不是一種奇怪的型別,起實質是整型的另乙個名字,如果沒有附加的操作,列舉中的第乙個引數預設就是整型0,之後依次遞加,當然,我們也可以認為的控制這個數值,例如: ?

12

3

4

5

typedefenummyenum;

可以這麼理解,我在傳參的時候,傳7和para1是完全一樣的效果,但是後者明顯更具可讀性。

如果熟悉ios的開發,你會發現系統很多的列舉型別都是可以複選的,例如檢視的拉伸模式,json的解析屬性等等,這不僅使**可讀性優化,也更加簡便了一些選項設定的**。當我們理解了列舉就是整型之後,會發現其實很容易做到這一點:

首先,我們給定義的列舉引數設定乙個有規律的值: ?

12

3

4

5

typedefenummyenum;

《符號是位運算中的左移運算子,將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時,...