48 votes

Enum de valeur multiple dans Obj-C

Dans les frameworks Cocoa et Cocoa Touch, les enums sont utilisés de manière constante. Je comprends comment l'utiliser sauf dans un cas, le cas où vous pouvez passer en paramètre plusieurs valeurs avec l'opérateur | . Comme dans :

 pageControl.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin);
 

L'énum est déclaré comme ça:

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

Comment puis-je définir moi-même ce type d'énumération (c'est-à-dire ce que << signifie) et comment puis-je vérifier les valeurs multiples lorsqu'il est passé en paramètre?

114voto

Joel Points 6958

<< est le bitshift de l'opérateur. Donc, 1 << 2 le raconte à décaler les bits de deux places de plus.

Exemple:

En binaire le nombre 1 est:

0001

1 << 2 - dire de dégager tous les bits vers la gauche 2 places, ce qui entraîne cette valeur:

0100

ou 4.

Les valeurs de chaque ENUM dans votre exemple, 1, 2, 4, 8, 16, etc. Ils pourraient tout aussi bien définir chaque enum à ces valeurs. Mais depuis qu'ils utilisent cette enum pour plusieurs valeurs, les valeurs binaires rend plus clair:

0001
0010
0100
1000

donc, ils ont écrit le bit de quarts de travail.

donc, si je OU (|) deux de ces valeurs, par exemple FlexibleLeftMargin (0001) et FlexibleWidth (0010- )), je voudrais obtenir la valeur suivante:

0011

Donc, ils utilisent chaque bit comme un drapeau si ils savent que vous avez de multiples valeurs.

Vous pouvez maintenant utiliser l'opérateur & afin de déterminer si vous avez une valeur définie.

0010 & 0011 = 0010

Donc, vous pourriez faire ceci pour vérifier si vous avez l'une des enums ensemble:

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

Espérons que cela a du sens. Pour plus de thurough explication sur les opérations bit à bit lire ceci: Wikipédia ~ Bits Opérateurs ou de recherche autour de "bits les opérateurs"

1voto

Yann Ramin Points 25139

<< est l'opérateur de décalage à gauche, ce qui signifie déplacer la valeur de gauche N bits vers la gauche. Dans ce cas, il définit un seul bit (bit 1, 2, 3, 4, 5) dans l'énumération, ce qui permet à l'opérateur OU au niveau du bit ( | ) de combiner des valeurs.

0voto

Madhu S. Kapoor Points 134

Je pense que nous ne pouvons pas utiliser l'instruction switch si nous avons utilisé ce type d'énum ... à droite ????

 myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin);

switch(myenum){
    case UIViewAutoresizingFlexibleRightMargin:{
        //Do something if myenum is UIViewAutoresizingFlexibleWidth
        break; 
    }
    case UIViewAutoresizingFlexibleWidth:{
        //Do something if myenum is UIViewAutoresizingFlexibleRightMargin
        break; 
    }
    default:{
       // Do something else here
    }
}
 

Nous devons utiliser si les états comme dans le post ci-dessus

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X