Множественное значение enum в Obj-C - PullRequest
48 голосов
/ 14 ноября 2010

В каркасах 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;

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

Ответы [ 2 ]

114 голосов
/ 14 ноября 2010

<< - оператор битового сдвига. Так что 1 << 2 говорит ему сместить бит на два пробела.

Пример:

В двоичном виде число 1 равно:

0001

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

0100

или 4.

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

0001
0010
0100
1000

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

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

0011

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

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

0010 & 0011 = 0010

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

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

Надеюсь, это имеет смысл. Для более подробного объяснения побитовых операций прочитайте это: Википедия ~ Битовые операторы или поиск " битовых операторов "

1 голос
/ 14 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...