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:

<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

Réponses

  • mpergandmpergand Membre
    février 2011 modifié #2
    <br />if(types &amp; ECPlayerCoreNotificationsTypePlaybackStateChanges)<br />&nbsp; ...<br />if(types &amp; ECPlayerCoreNotificationsTypeNowPlayingChanges)<br /> ...<br /><br />etc ...<br />
    


    on peut tester plusieurs types à  la fois en faisant un OR ( ou un +):
    <br />if(types &amp; (ECPlayerCoreNotificationsTypePlaybackStateChanges |&nbsp; ECPlayerCoreNotificationsTypeNowPlayingChanges) )<br />&nbsp; ...<br />
    
  • 21:15 modifié #3
    Tout simplement, merci beaucoup !
  • FKDEVFKDEV Membre
    21:15 modifié #4
    Sur un système 32 bits, un NSUinteger a une taille de 32 bits.
    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;
  • LexxisLexxis Membre
    février 2011 modifié #5
    Ce qu'il y a de bien avec les champs de bits c'est que tu n'est pas obligé de manipuler les opération booléenne.

    En reprennant l'exemple de FKDEV

    struct {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int userInteractionDisabled:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int implementsDrawRect:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int implementsDidScroll:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int implementsMouseTracking:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int hasBackgroundColor:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int isOpaque:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int becomeFirstResponderWhenCapable:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int interceptMouseEvent:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int deallocating:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int debugFlash:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int debugSkippedSetNeedsDisplay:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int debugScheduledDisplayIsRequired:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int isInAWindow:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int isAncestorOfFirstResponder:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int dontAutoresizeSubviews:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int autoresizeMask:6;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int patternBackground:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int fixedBackgroundPattern:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int dontAnimate:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int superLayerIsView:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int layerKitPatternDrawing:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int multipleTouchEnabled:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int exclusiveTouch:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int hasViewController:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int needsDidAppearOrDisappear:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int gesturesEnabled:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int deliversTouchesForGesturesToSuperview:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int chargeEnabled:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int skipsSubviewEnumeration:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int needsDisplayOnBoundsChange:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int hasTiledLayer:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int hasLargeContent:1;<br />&nbsp;  unsigned int alwaysScaleContent:1;<br />&nbsp; &nbsp; } _viewFlags;
    


    dans ce cas tu peux accéder aux différents bits comme cela
    <br />BOOL value = _viewFlags.userInteractionDisabled;<br />
    

    ou
    <br />if (_viewFlags.userInteractionDisabled) {<br />&nbsp; bla bla bla...<br />}<br />
    

    De le même facon tu peux modifier la valeur d'un "bit"
    <br />_viewFlags.userInteractionDisabled = YES (ou NO)<br />
    

    Enfin dans un champ de bit les varibles ne sont pas limités à  un seul bit:
    <br />struct {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int red:8;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int green:8;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int blue:8;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int alpha:8<br />} colorFlags;<br />
    


    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:
    <br />enum {<br /> unValue = 0,<br /> deuxValue,<br /> troisValue,<br /> quatreValue=10,<br />etc..<br />}<br />
    

    exit les opérations booléennes.
Connectez-vous ou Inscrivez-vous pour répondre.