Création d'un objet depuis "+ (id)dictionary..."

14:36 modifié dans API AppKit #1
Bonjour,

Présentation de l'histoire : jusqu'à  présent j'utilisais une catégorie pour ajouter des méthodes à  NSDictionary comme pas exemple bookForKey, integerForKey, etc... afin d'éviter un [[objectForKey:key] intValue], etc...

Pour des raisons de compatibilité je me suis fait une sous classe de NSDictionary que j'ai nommée (MPDictionary (modeste le gas)).

Petit problème : j'utilise plusieurs appels comme +(id)dictionary... j'ai pensé vite dans un premier temps mais [MPDictionary dictionary] ne fonctionne pas (il renvoit un NSDictionary), je dois ajouter une méthode + (id)dictionary et c'est la que ça bloque...

J'ai d'abord fait un sauvage
return [[MPDictionary alloc] autorelease];


Mais est une bonne façon ? Et dans le cas de + (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary comment faire puisque ce n'est pas un mutable ?

Voilà  un bon problème de newbie et ça me rend fou de rage :(

Réponses

  • wiskywisky Membre
    septembre 2005 modifié #2
    Tu peut pas faire un [tt]return [[super alloc] dictionaryWithDictionary:otherDictionary][/tt] pour
    + (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary

    Simple supposition ;)

    edit:

    ce qui donnerait:
    <br />+ (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary<br />{<br />&nbsp; &nbsp; return [[super alloc] dictionaryWithDictionary:otherDictionary];<br />}<br />
    

  • septembre 2005 modifié #3
    dans 1126097396:

    Tu peut pas faire un [tt]return [[super alloc] dictionaryWithDictionary:otherDictionary][/tt] pour
    + (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary


    Ce qui donne un... NSDictionary ;)
    Je vais changer la manière de faire, j'y gagnerais en temps, merci qd même....
  • septembre 2005 modifié #4
    Quand tu travailles dans des méthodes de classes de ce genre là , tu ne dois jamais nommer explicitement la classe, mais plutôt faire:

    [tt]return [[self class] dictionaryWithDictionary:aDict];[/tt]

    Si tu veux travailler avec des alloc, n'oublie pas les init, des méthodes comme +(id)dictionary renvoient un dictionnaire vide, mais initialisé.
  • 14:36 modifié #5
    dans 1126097396:

    Tu peut pas faire un [tt]return [[super alloc] dictionaryWithDictionary:otherDictionary][/tt] pour
    + (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary

    Simple supposition ;)

    edit:

    ce qui donnerait:
    <br />+ (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary<br />{<br />&nbsp; &nbsp; return [[super alloc] dictionaryWithDictionary:otherDictionary];<br />}<br />
    




    À mon humble avis, tu n'as pas du vérifier le code que tu as proposé... Après un alloc, tu ne peux utiliser que des méthodes d'instance et dictionaryWith.... est une méthode de classe.
  • 14:36 modifié #6
    Ok, je veux bien essayer d'utiliser [self class] mais normalement, self vaut nil (ou n'importe quoi) puisque rien n'est créé ?

    Bref, pour le fun (j'ai tout changé maintenant) et si j'ai bien capté :

    J'ai d'une part une sous-classe de NSDictionary que je nomme MPDictionary avec la méthode :
    + (id)_dictionaryWithDictionary:(NSDictionary *)otherDictionary<br />{<br />	NSLog(@&quot;La %@&quot;,self);<br />	return [[self class] dictionaryWithDictionary:otherDictionary];<br />}
    



    Et d'autre part un part :
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification<br />{<br />	MPDictionary *d=[MPDictionary _dictionaryWithDictionary:<br />			[NSDictionary dictionaryWithObjectsAndKeys:@&quot;cestpopol&quot;,@&quot;quicest&quot;,nil]];<br /><br />	NSLog(@&quot;MPDictionary: %@&quot;,d);<br />}
    


    Mais le tout génère une Exception...
  • wiskywisky Membre
    14:36 modifié #7
    Et si tu fait
    <br />+ (id)_dictionaryWithDictionary:(NSDictionary *)otherDictionary<br />{<br />NSLog(@&quot;La %@&quot;,self);<br />return [NSDictionary dictionaryWithDictionary:otherDictionary];<br />}<br />
    



    Renaud > En effet je n'est pas testé le code, celui ci dessu non plus ;)
  • septembre 2005 modifié #8
    Dans les méthodes de classe, self est une référence vers l'objet classe et non vers une instance.

    Donc déjà  dans ton premier NSLog, tu dois mettre:
    [tt]NSLog(@La %@",NSStringFromClass([self class]);[/tt](*)

    Alors maintenant tu vas me dire si self représente l'objet classe, pourquoi utiliser [self class] au lieu de self. La réponse est simple en cas de sous-classage: le self va référer à  la classe dans laquelle il est utilisé (donc toute sous classe de MPDictionary va renvoyer du MPDictionary pour cette méthode), tandis que [self class] va tenir compte des éventuelles sous-classes.

    (*) Oups, je n'avais pas vu qu'il existait une méthode de classe description. donc normalement ton code devrait marcher.
  • 14:36 modifié #9
    Bon voilà  le problème: NSDictionary et MSMutableDictionary sont en fait des classes composites. Les objets renvoyés sont en fait des instances de sous-classes privées de NSDictionary. Si tu sous-classes NSDictionary, tu dois redéfinir les méthodes primitives. C'est à  mon avis beaucoup de chipo pour pas grand chose. Quel est le problème de rester avec une catégorie en fait?
  • 14:36 modifié #10
    mac+, je ne veux pas un NSDictionary mais un NSDictionary sous classé nommé MPDictionary. MPDictionary contient des méthodes qui lui sont propres... puisque c'est une sous classe.

    Renaud, ok pour self, ce n'est pas encore limpide mais je préfère y revenir plus tard, voir dans un autre topic. NSLog(... était là  pour voir ce que valait self, j'ai oublié de le supprimer, ce n'est pas lui le problème...

    J'espère que j'ai bien fait passer ce que je cherchais à  comprendre...
  • septembre 2005 modifié #11
    J'ai des problèmes de compatibilité, certains utilisateurs installent des merdes genres input manager qui court-circuitent ma catégorie. J'avais déjà  remarqué ce problème avec SetAlphaValue et j'avais abandonné l'utilisation de caté pour lui...

    Oui, je me suis refait un NSDictionary maison...

    Je suis sur que tu vas me dire que j'aurais du lire la doc...  >:)
Connectez-vous ou Inscrivez-vous pour répondre.