Множественное перечисление значений в Obj-C - программирование
Подтвердить что ты не робот

Множественное перечисление значений в Obj-C

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

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;

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

4b9b3361

Ответ 1

<< - оператор битовой смены. Таким образом, 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 или найдите вокруг " бит-операторы"

Ответ 2

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