darwin之列舉值得組合使用(Task)

2021-08-11 14:58:48 字數 2171 閱讀 6775

乙個task可以有多個flag

kalive = 0x80000000, 二進位制:1000 0000 0000 0000 0000 0000 0000 0000 

kaliveoff = 0x7fffffff 二進位制:0111 1111 1111 1111 1111 1111 1111 1111

getevents返回除了kalive之外的其他標識,而自身也被清空,只留kalive

列舉的『高階用法』組合運用:例如乙個介面裡有:增、刪、查、改等操作,但對應不同使用者就有不同操作許可權。例如a使用者只能增、刪,而b使用者只能查、改等等。如果在許可權表中某乙個字段型別指定使用者的操作許可權時,問題就出來了。來看看一下3種解決方式:

1.每個操作許可權一條資料,缺點:每次更改許可權時,避免不了刪除和新增,並且資料量龐大,如果乙個使用者有一千許可權就代表有一千條資料,那這張表的資料就不敢想象了。

2.乙個字段儲存所有的操作許可權,每個操作許可權使用 某個指定的符號作為分隔符,這種方式叫簡單、方便。

3.就是使用我們的列舉組合,在乙個字段儲存所有的操作許可權,但值只為乙個數,不像方式2使用分隔符分開。

當然,還有很多方式可以解決這種問題。我們現在就來看看如何使用列舉組合來代表多個操作許可權。

5.1:定義乙個操作許可權列舉:

[flags]//必須打上乙個標記,打上這個標記系統才能識別這個列舉可使用組合方式

public enum role

5.2:如果使用者有刪除、修改的許可權在列舉定義中只有1和2的列舉,那怎麼將這兩個列舉值組合成乙個列舉值儲存到資料庫呢?很簡單,看一下**:

int allrole = ((int)role.刪除資料) + ((int)role.修改資料);

//這時allrole的值為3 (兩個列舉對應值相加:1+2=3),這時直接將allrole值儲存到資料就可以了

現在我們就來判斷使用者是否具有某個操作許可權,先從資料庫中取出許可權值,以上述,allrole則為資料庫中取出的值,為3,接下來我們通過位算符來判斷:

role myallrole = (role)allrole;//將int值強制轉換為列舉

//此時,myallrole的名稱為  『 刪除資料, 修改資料 』 ,值為3

//判斷是否有刪除許可權

if ((myallrole & role.刪除資料) == role.刪除資料)

注意此處使用了 位算符& 方式來獲取判斷,關於位算符的使用在此就不講了。組合運用大概就是這樣。必須注意的地方就是列舉值的定義,我們可以看到role列舉的定義值的規律,0到1,1到2,2到4,4到8,8到16......當前的值為上個值的2次方,為什麼要這樣定義呢?是因為任何的組合都可以在列舉範圍中某幾個值的總和,例如組合值為15,那15就等於列舉定義範圍裡的定義值為1、2、4、8相加,15=1+2+4+8。只有按規律定義值,就可以組合成任意數。

組合必須注意的幾點:

1.列舉定義時,必須打上[flags]標記,系統才會根據這個標記來決定這個列舉是否可組合使用

2.定義列舉的值必須按以上所說的規律定義,例如:0、1、2、4、8、16、32.......也可以使用3次方的方式,例如:0、3、6、12、24..........

6.使用優點總結

1.規則性:例如資料庫某個欄位的值只在1、2、3、4,例如狀態,當我們在錄入資料時,我們可以從列舉中取值,這樣避免了這個字段出現其它值,同時也使**更容易理解,因為在取值時,我們是拿列舉定義的名稱,名稱是我們自定義的易理解的中文或英文。

2.易解性:就是上述所說的,列舉名稱是用中文和英文來定義,在使用時,則拿列舉的名稱,這樣一看**就知道。而不會在**中寫1、2、3、4這樣的數字,也許過段時間自己寫的都忘了了1代表什麼?2代表什麼?了,更何況日後他人的維護呢。

還有很多優點。

列舉值的組合使用

有時候列舉只返回一項會顯得不夠用,比如新建乙個列舉型別week它總共有7項分別代表週日到周一,宣告乙個week型別的列舉值work用來表示乙個人的值日安排,這個人的值日安排可能不止一天,如果work的值只能為week7個列舉項中的乙個顯然是不夠用的。這時候就需要用到列舉的組合。想要使用列舉的組合就需...

ios開發系列之列舉型別的使用

列舉值 它是乙個整形 int 並且,它不參與記憶體的占用和釋放,列舉定義變數即可直接使用,不用初始化.在 中使用列舉的目的只有乙個,那就是增加 的可讀性 enum是列舉型別,用來定義一系列巨集定義常量,相當於一系列的 define xx xx,第乙個值預設從0 開始,其後依次加一,可以對每乙個列舉元...

Android之使用列舉利弊及替代方案

android上不應該使用列舉,佔記憶體,應該使用 def註解來替代 每乙個列舉值都是乙個物件,在使用它時會增加額外的記憶體消耗,所以列舉相比與 integer 和 string 會占用更多的記憶體。較多的使用 enum 會增加 dex 檔案的大小,會造成執行時更多的開銷,使我們的應用需要更多的空間...