Enum valor múltiplo em Obj-C

Nos frameworks Cocoa e Cocoa Touch, os enums são usados ​​como constantes. Eu entendo como usá-lo, exceto em um caso, o caso, você pode passar como um valor múltiplo parâmetro com o | operador. Como em:

 pageControl.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin); 

O enum é declarado assim:

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

Como eu posso definir esse tipo de enum (ou seja, o que significa << ) e como posso verificar se há múltiplos valores quando passado como um parâmetro?

<< é o operador bitshift. Então 1 << 2 diz para mudar o bit dois espaços.

Exemplo:

Em binário, o número 1 é:

 0001 

1 << 2 significa deslocar todos os bits para os 2 espaços da esquerda, o que resulta nesse valor:

 0100 

ou 4 .

Assim, os valores de cada ENUM no seu exemplo são 1, 2, 4, 8, 16, etc. Eles poderiam ter definido cada enum para esses valores. Mas como eles usam esse enum para vários valores, os valores binários tornam isso mais claro:

 0001 0010 0100 1000 

então eles escreveram usando os turnos de bits.

então, se eu OR ( | ) dois desses valores juntos, por exemplo FlexibleLeftMargin ( 0001 ) e FlexibleWidth ( 0010 ), obteria o seguinte valor:

 0011 

Então, eles usam cada bit como sinalizador para saberem que você tem vários valores definidos.

Agora você pode usar o operador AND para descobrir se tem um valor específico definido.

 0010 & 0011 = 0010 

Então você pode fazer isso para verificar se você tem um conjunto de enums:

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

Espero que isso faça sentido. Para obter uma explicação mais detalhada sobre operações bit a bit, leia isto: Operadores de bit da Wikipédia ou pesquise " operadores de bit "

<< é o operador de deslocamento à esquerda, ou seja, move o valor esquerdo N bits para a esquerda. Nesse caso, ele está definindo um bit único (bit 1, 2, 3, 4, 5) no enum, que permite que o operador OR bit a bit ( | ) combine valores.