2010-11-14 4 views
47

В каркасах Cocoa и Cocoa Touch в качестве констант используются перечисления. Я понимаю, как использовать его, кроме как в одном случае, случай, который вы можете передать как параметр с несколькими значениями с помощью оператора |. Как и в:Множественное перечисление значений в Obj-C

pageControl.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin); 

Перечисление объявляется так:

enum { 
    UIViewAutoresizingNone     = 0, 
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
    UIViewAutoresizingFlexibleWidth  = 1 << 1, 
    UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
    UIViewAutoresizingFlexibleTopMargin = 1 << 3, 
    UIViewAutoresizingFlexibleHeight  = 1 << 4, 
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 
}; 
typedef NSUInteger UIViewAutoresizing; 

Как я могу определить себя этот тип перечисления (т.е. то, что << средства) и как я могу проверить для значений мультипликаторов при передаче в виде параметр?

ответ

112

<< - это оператор с битрейтом. Таким образом, 1 << 2 сообщает, что он переводит бит на два пробела.

Пример:

В двоичном числе 1 является:

0001 

1 << 2 означает переложить все биты в левых 2 пространствах, что приводит к этому значению:

0100 

или 4.

Таким образом, значения каждого ENUM в вашем примере равны 1, 2, 4, 8, 16 и т. Д. Они могли бы точно установить каждое перечисление на эти значения. Но так как они используют это перечисление для нескольких значений, двоичные значения делают его более ясным:

0001 
0010 
0100 
1000 

, чтобы они писали, используя битовые сдвиги.

так, если я OR (|) два из этих значений вместе, например FlexibleLeftMargin (0001) и FlexibleWidth (0010), я получаю следующее значение:

0011 

Таким образом, они используют каждый бит как чтобы они знали, что у вас установлено несколько значений.

Теперь вы можете использовать оператор AND &, чтобы выяснить, установлено ли определенное значение.

0010 & 0011 = 0010 

Таким образом, вы могли бы сделать это, чтобы проверить, если у вас есть одно из перечислений набор:

myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin); 
if((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) { 
    // myenum has UIViewAutoresizingFlexibleLeftMargin set! 
} 

Надеемся, что это имеет смысл. Для более подробного объяснения поразрядных операций читайте это: Wikipedia ~ Bit Operators или выполните поиск по «bit operators»

+1

Это имеет смысл, Джоэл. Спасибо за полный ответ! – gcamp

+0

Вы ставите. Я добавил ссылку, чтобы объяснить упомянутые операторы и некоторые дополнительные операторы бит, если вы заинтересованы. – Joel

+4

Будьте осторожны, так как ваш пример не работает. Равенство (==) имеет более высокий приоритет, чем поразрядный, и (&) в C, поэтому это всегда будет терпеть неудачу, если только (myenum & 0x01) не будет истинным, а это не то, что вы имеете в виду. Нужно быть, если ((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMarging) doSoemthing() –

0

<< - оператор сдвига влево, означающий перемещение левого значения N бит влево. В этом случае он устанавливает один бит (бит 1, 2, 3, 4, 5) в перечислении, который позволяет побитовому оператору ИЛИ (|) объединить значения.

Смежные вопросы