Options
Bonjour à tous,
N'ayant pas fait beaucoup de C, j'aimerai que quelqu'un m'explique le fonctionnement des 'options'.
ça n'est pas très clair dit comme ça, c'est pour ça que je vais développer un peu plus:
Par exemple, on peut passer des options concernant une animation sur UIView. Voir l'enum de UIViewAnimationOptions.
On peut donc y passer plusieurs valeurs NSUInteger en les séparant par |
Je cherche à savoir comment traiter ces options après coup. Donc comment obtenir chacun des options passées en argument:
Dans mon esprit, il aurait été plus simple, pour moi, d'utiliser directement une NSArray contenant les options.. Mais je trouve ça lourd de devoir passer des NSNumber.
J'espère avoir été clair, et vous remercie d'avance pour vos éclaircissements
N'ayant pas fait beaucoup de C, j'aimerai que quelqu'un m'explique le fonctionnement des 'options'.
ça n'est pas très clair dit comme ça, c'est pour ça que je vais développer un peu plus:
Par exemple, on peut passer des options concernant une animation sur UIView. Voir l'enum de UIViewAnimationOptions.
On peut donc y passer plusieurs valeurs NSUInteger en les séparant par |
Je cherche à savoir comment traiter ces options après coup. Donc comment obtenir chacun des options passées en argument:
<br />enum<br />{<br /> ECPlayerCoreNotificationsTypePlaybackStateChanges = 0x01,<br /> ECPlayerCoreNotificationsTypeNowPlayingChanges = 0x02,<br /> ECPlayerCoreNotificationsTypeVolumeChanges = 0x04<br /><br />};<br />typedef NSUInteger ECPlayerCoreNotificationsTypes;<br /><br />+ (void)addObserver:(id)anObserver forPlayerCoreNotificationsTypes:(ECPlayerCoreNotificationsTypes)types;<br /><br />
Dans mon esprit, il aurait été plus simple, pour moi, d'utiliser directement une NSArray contenant les options.. Mais je trouve ça lourd de devoir passer des NSNumber.
J'espère avoir été clair, et vous remercie d'avance pour vos éclaircissements
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
on peut tester plusieurs types à la fois en faisant un OR ( ou un +):
Tu peux donc y loger 32 options booléennes.
C'est beaucoup plus efficace qu'un NSArray en terme de mémoire et de perf. pour passer un petit nombre d'informations connues à l'avance.
On appelle ça un champ de bit en général. On en utilise à toutes les sauces dans l'embarqué.
Après il ne faut pas avoir peur de manipuler les bits, mais il n'y a pas de raison, quand on connait les opérateurs associés '|' et '&'.
Et si tu regardes les headers cocoa, tu trouveras des 'structures en bits', c'est pareil mais plus typé.
Dans UIView par exemple :
struct {
unsigned int userInteractionDisabled:1;
unsigned int implementsDrawRect:1;
unsigned int implementsDidScroll:1;
unsigned int implementsMouseTracking:1;
unsigned int hasBackgroundColor:1;
unsigned int isOpaque:1;
unsigned int becomeFirstResponderWhenCapable:1;
unsigned int interceptMouseEvent:1;
unsigned int deallocating:1;
unsigned int debugFlash:1;
unsigned int debugSkippedSetNeedsDisplay:1;
unsigned int debugScheduledDisplayIsRequired:1;
unsigned int isInAWindow:1;
unsigned int isAncestorOfFirstResponder:1;
unsigned int dontAutoresizeSubviews:1;
unsigned int autoresizeMask:6;
unsigned int patternBackground:1;
unsigned int fixedBackgroundPattern:1;
unsigned int dontAnimate:1;
unsigned int superLayerIsView:1;
unsigned int layerKitPatternDrawing:1;
unsigned int multipleTouchEnabled:1;
unsigned int exclusiveTouch:1;
unsigned int hasViewController:1;
unsigned int needsDidAppearOrDisappear:1;
unsigned int gesturesEnabled:1;
unsigned int deliversTouchesForGesturesToSuperview:1;
unsigned int chargeEnabled:1;
unsigned int skipsSubviewEnumeration:1;
unsigned int needsDisplayOnBoundsChange:1;
unsigned int hasTiledLayer:1;
unsigned int hasLargeContent:1;
unsigned int alwaysScaleContent:1;
} _viewFlags;
En reprennant l'exemple de FKDEV
dans ce cas tu peux accéder aux différents bits comme cela
ou
De le même facon tu peux modifier la valeur d'un "bit"
Enfin dans un champ de bit les varibles ne sont pas limités à un seul bit:
Les champs de bits sont dépendant de l'endianness.
Par contres les "enum"ération sont de simples liste de valeurs (tu peux d'ailleurs en faire un type de variables, ce qui te permet de vérifier les valeurs que tu affectes à ces variables au moment de la compilation...). Souvent Apple définit ces liste de valeurs pour quelles correspondent à des bits bien distincts. Les opérations booléennes fonctionnent sur ce genre de valeur.
Avec un enum comme cela:
exit les opérations booléennes.