[Résolu] Stockage de SELectors dans un NSDictionary

BloodshedBloodshed Membre
avril 2008 modifié dans API AppKit #1
Bonjour,

Dans le cadre de mon application, je dois stocker des selectors dans un NSDictionary, afin de pouvoir les rappeler plus tard. Le probleme etant que le NSDictionary n'accepte que des objets, et SEL semble etre un type primitif. Du coup je ne sais pas comment stocker ce selector. Une idee ?

Afin d'illustrer mon probleme, voici un exemple simplifie de ce que je souhaites faire :

<br />@synthesize selectors; // variable d&#39;instance de type NSMutableDictionary contenant les selectors<br /><br />- (void)addSelector:(SEL)aSelector forIdentifier:(NSString*)anIdentifier<br />{<br />	// Ca ne marche pas car le dictionary n&#39;accepte que des objets:<br />	[selectors setObject:aSelector forKey:anIdentifier];<br />}<br /><br />- (void)callSelectorForIdentifier:(NSString*)anIdentifier<br />{<br />	[self performSelector:[selectors objectForKey:anIdentifier]];<br />}<br />


Actuellement je triche en stockant le nom de la methode liée au selecteur sous forme de NSString*, puis en creeant le selecteur avec NSSelectorFromString()

<br />@synthesize selectors; // variable d&#39;instance de type NSMutableDictionary contenant les selectors<br /><br />- (void)addSelector:(NSString*)aSelector forIdentifier:(NSString*)anIdentifier<br />{<br />	// Ca marche car aSelector est une NSString<br />	[selectors setObject:aSelector forKey:anIdentifier];<br />}<br /><br />- (void)callSelectorForIdentifier:(NSString*)anIdentifier<br />{<br />	// On recréé le selector avec la NSString:<br />	SEL aSelector = NSSelectorFromString([selectors objectForKey:anIdentifier]);<br />	[self performSelector:aSelector];<br />}<br />


Mais ce n'est pas très élégant, ni dans l'esprit de l'Objective-C, aussi connaissez-vous un moyen de stocker ces selectors (ou du moins de transformer un selector sous forme de NSString* le temps du stockage) ?

Réponses

  • ChachaChacha Membre
    15:47 modifié #2
    dans 1208858971:

    Actuellement je triche en stockant le nom de la methode liée au selecteur sous forme de NSString*, puis en creeant le selecteur avec NSSelectorFromString()
    Mais ce n'est pas très élégant, ni dans l'esprit de l'Objective-C, aussi connaissez-vous un moyen de stocker ces selectors (ou du moins de transformer un selector sous forme de NSString* le temps du stockage) ?

    Pourquoi trouves-tu ça inélégant ? C'est plutôt conforme à  l'encapsulation en Objective-C...
    Cela dit, je me suis demandé si NSValue pouvait convenir, et j'ai trouvé une réponse (que je n'ai pas essayée) :
    http://www.cocoabuilder.com/archive/message/cocoa/2006/12/6/175554
    <br />SEL someSelector = @selector(someMethod:);<br />NSValue *selectorValue = [NSValue value:&amp;someSelector&nbsp; <br />withObjCType:@encode(SEL)];<br />
    

    Si ça marche, tant mieux, sinon les NSStringFromSelector ne me choquent pas.

    +
    Chacha
  • 15:47 modifié #3
    Tu peux aussi créer ta propre structure stockant un/des SEL.
  • schlumschlum Membre
    15:47 modifié #4
    SEL sel = @selector(test:);<br />NSValue *val = [NSValue valueWithBytes:&amp;sel objCType:@encode(SEL)];<br />SEL sel2;<br />[val getValue:&amp;sel2];
    


    Fonctionne

    Sinon, NSStringFromSelector/NSSelectorFromString fonctionne aussi...
  • BloodshedBloodshed Membre
    15:47 modifié #5
    dans 1208859659:

    Pourquoi trouves-tu ça inélégant ? C'est plutôt conforme à  l'encapsulation en Objective-C...

    Ce n'est pas le fait de stocker des strings qui me gene, mais plutot de demander une NSString* en tant qu'argument d'une methode qui, semantiquement, veut en fait des selectors.

    dans 1208860349:

    Sinon, NSStringFromSelector/NSSelectorFromString fonctionne aussi...

    Ah mais c'est que je ne savais pas que la fonction NSStringFromSelector() existait aussi ! J'ai pourtant fait une recherche mais dans l'aide Apple il n'y avait que la fonction NSSelectorFromString(). Je vais utiliser ca !

    Merci a tous !  :p
  • ChachaChacha Membre
    avril 2008 modifié #6
    dans 1208862002:

    Ah mais c'est que je ne savais pas que la fonction NSStringFromSelector() existait aussi ! J'ai pourtant fait une recherche mais dans l'aide Apple il n'y avait que la fonction NSSelectorFromString(). Je vais utiliser ca !


    Ah ok, j'avais pas vu que tu n'utilisais que NSSelectorFromString !
    ça me fait penser que j'avais mis très longtemps à  "découvrir" Foundation/Foundation.h. Ce header comporte beaucoup de fonctions utilitaires extrêmement utiles. Mais comme ce ne sont pas des méthodes, on tombe rarement dessus en explorant la doc de Cocoa en passant de classe en classe.
Connectez-vous ou Inscrivez-vous pour répondre.