intValue plutôt que total++ ?

Paul_pPaul_p Membre
Salut,

j'aurais aimé savoir pourquoi ici on utilise intValue :

si on voulait le total, on pourrait utiliser total++ ; , ici que fait intValue? le résultat final est un label qui change de numéro en fonction du "count" :

- (int)countOfClass:(Class)aClass<br />{<br />	int total = 0;<br />	for (id key in counts) {<br />		if ([key isKindOfClass:aClass]) {<br />			total += [[counts objectForKey:key] intValue];<br />		}<br />	}<br />	return total;<br />}


Merci  :)

Réponses

  • CéroceCéroce Membre, Modérateur
    17:38 modifié #2
    Il nous manque le contexte. Je suppose que "counts" est un NSDictionary de NSNumbers.

    NSNumber est un objet qui encapsule un nombre. En effet, Objective-C n'est pas un langage objet pur, et on ne peut donc pas stocker directement un nombre dans une collection (NSArray, NSDictionary, etc.). On ne peut pas non plus faire de calculs sur les NSNumbers, il faut donc les convertir en types non-objets. Ainsi, -[NSNumber intValue] donne la valeur de l'objet sous forme d'un type int.


    P.S.: Message aux débutants: ce code n'est pas un exemple à  suivre.
  • Paul_pPaul_p Membre
    juin 2011 modifié #3
    Merci,

    alors ici le intValue renvoie "1"? pour dire qu' "il existe"?

    counts est bien nsMutable Dictionnary avec des nsnumbers.

    Sinon, pourquoi ce code n'est pas un bon exemple à  suivre?

    il y a ce code dans une autre fonction qui me semble plus clair :

    [counts setObject:[NSNumber numberWithInt:[count intValue]+1] forKey:anObject];
    


    les deux sont équivalents en terme de syntaxe?

    Merci ;)
  • AliGatorAliGator Membre, Modérateur
    17:38 modifié #4
    Non le intValue renvoie une valeur contenant l'évaluation de l'objet en tant qu'entier.
    Par exemple, si [tt][counts objectForKey:xxx][/tt] renvoie un objet de type NSNumber, alors intValue renvoie la valeur entière contenue dans ce NSNumber. Si [tt][counts objectForKey:xxx][/tt] renvoie une NSStirng, cela va essayer d'interpréter cette chaà®ne comme un entier et te retourner le résultat.

    Mais comme le dit Céroce, on a aucun contexte là  avec ton code. C'est quoi "counts" ? Je suppose que c'est un NSDictionary (pour répondre à  "objectForKey" il y a des chances), mais il vient d'où ? Il contient quoi au juste ? Il vient d'où ce code, il a été construit comment ce dictionnaire "counts" et il sort d'où ?

    Bref un code comme ça sans contexte on peut pas deviner ce qu'est sensé représenter ton objet counts et à  quoi il sert et dans quel contexte il est utilisé ou peuplé.
    Si la personne qui a écrit ce code voulait que total contienne le nombre de clés qui sont de type aClass, oui il aurait écrit total++. Mais là  il a voulu compter la somme des valeurs associés aux clés dont le type est aClass apparemment... Après à  quoi lui sert ce dictionnaire "count" et qu'est ce qu'il y met dedans comme valeur, ça on peut pas savoir sans le contexte
  • Paul_pPaul_p Membre
    juin 2011 modifié #5
    Salut,

    alors voilà  : j'ai plusieurs boutons avec comme titres des numéros et des strings, quand on clique dessus, ça incrémente la ligne "numéros" de +1, ou la ligne "strings" de +1. Ca le fait bien, mais je comprends pas : pourquoi on "ajoute" intValue à  "total" , plutôt que de simplement faire un total++ par exemple. (EDIT: counts est un NSMutableDictionnary qui contient les numéros et les strings)

    Voilà  le code:

    dans la view-controller : updateUI et collect (qui appelle le "collect" du modèle, voir tout en bas)

    - (void)collect:(UIButton *)sender<br />{<br />	NSString *title = sender.titleLabel.text;<br />	<br />	double numericValue = [title doubleValue];<br />	if (numericValue) {<br />		[model collect:[NSNumber numberWithDouble:numericValue]];<br />	} else {<br />		[model collect:title];<br />	}<br />	<br />	[self updateUI];<br />}
    


    la fonction update ui pour actualiser les champs de texte :

    - (void)updateUI<br />{<br />	self.totalNumberCountLabel.text = [NSString stringWithFormat:@&quot;%d&quot;, model.totalNumberCount];<br />	self.totalStringCountLabel.text = [NSString stringWithFormat:@&quot;%d&quot;, model.totalStringCount];<br />
    





    dans le model : on appelle countOfClass avec totalNumberCount (appelé depuis la vue au-dessus), avec le fameux intValue :

    - (int)countOfClass:(Class)aClass<br />{<br />	int total = 0;<br />	for (id key in counts) {<br />		if ([key isKindOfClass:aClass]) {<br />			total += [[counts objectForKey:key] intValue];<br />		}<br />	}<br />	return total;<br />}<br /><br />- (int)totalNumberCount<br />{<br />	return [self countOfClass:[NSNumber class]];<br />}
    



    et dans le model, la fonction collect (appelée depuis la view) :

    - (void)collect:(id)anObject<br />{<br />	if (anObject) {<br />		NSNumber *count = [counts objectForKey:anObject];<br />		if (!counts) counts = [[NSMutableDictionary alloc] init];<br />		[counts setObject:[NSNumber numberWithInt:[count intValue]+1] forKey:anObject];<br />	}<br />}
    



    Donc, je comprends pas : quand on appelle "countOfClass" (avant-dernier code), pourquoi ça nous donne "+1" dans le champ de texte, alors qu'on utilise "intValue", en rajoutant ce intValue à  "total". Et par ailleurs, si "aClass" dans la fonction countOfClass est une string, on calcule quand même son "intValue"...

    est-ce que vous comprenez mon problème?

    Merci  :D
  • CéroceCéroce Membre, Modérateur
    17:38 modifié #6
    dans 1308009791:

    est-ce que vous comprenez mon problème?


    Oui, ce code est rempli de bidouilles pour régler des cas particuliers qui n'existent que parce que l'auteur n'a pas réfléchi à  la conception. Rien que l'utilisation de isKindOfClass: pour du fonctionnel en témoigne.
  • Paul_pPaul_p Membre
    17:38 modifié #7
    et as-tu un conseil pour améliorer/comprendre ce intValue?  :D
  • AliGatorAliGator Membre, Modérateur
    17:38 modifié #8
    Revoir toute la conception de l'appli
  • Paul_pPaul_p Membre
    17:38 modifié #9
    refaire toute la conception pour ma question?  ::)

    bon merci quand même...
  • AliGatorAliGator Membre, Modérateur
    17:38 modifié #10
    Bah faut dire que ta question elle est un peu beaucoup sans contexte. Et puis tu n'as pas l'air de comprendre ce que fait le code (certes il est pas top, mais tu n'as pas l'air de comprendre le contexte même de l'appli, quelle idée le créateur de l'appli avait en tête en écrivant cette méthode, que sont les divers objets manipulés comme counts ou autre et quand ils servent dans l'appli...
    La question n'est pas "pourquoi il utilise intValue plutôt que total++" mais "quels sont ces objets que je manipule et que représente chaque élément, pour comprendre pourquoi il fait ça" (et ça on ne peut pas t'aider si on ne connait pas le projet)

    C'est comme si je te disais
    tiens voilà  j'ai une méthode "plouf" qui fait "toto = toto+5", tu peux m'expliquer pourquoi il a mis 5 comme valeur et pas 3 ?
    Va répondre à  une question de genre... (et si le mec qui a écrit le code avait bien construit son code, il aurait de toute façon pas laissé "5" tout seul il aurait plutôt mis une constante)
  • Paul_pPaul_p Membre
    juin 2011 modifié #11
    Non AliGator tu as du sauter mon dernier message, car le code je le comprends bien, je n'ai pas de problème avec le reste du code d'ailleurs, et le contexte je t'ai mis un long message dessus. Simplement je comprends pas cette histoire de intValue, moi j'aurais mis total++ (alors qu'avec intValue, le code incrémente bien le champ de texte comme il faut). Pour ce qui est du counts, je t'ai dit déjà  : c'est un NSMutableDictionnary qu'on modifie à  chaque clic sur un bouton, qu'il contienne un string ou un number.

    Bon c'est pas grave si vous avez pas la réponse, mais ma question concernait le intValue et rien d'autre  :D

    a+ ;)
  • BunoBuno Membre
    17:38 modifié #12
    Yop!
    Je m'immisce,  même si je n'ai lu qu'en diagonale...
    Pourquoi utiliser intValue plutôt que ++?
    Eh bin je t'offre une piste de réflexion:
    - ++, opérateur d'incrémentation, incrémente ta variable de 1, qoi qu'il arrive
    - intValue convertit ton objet en int. Donc, potentiellement, la valeur peut être 0, 1, 2,...

  • Paul_pPaul_p Membre
    17:38 modifié #13
    Ok merci, j'avance petit à  petit dans mon apprentissage  8--)
Connectez-vous ou Inscrivez-vous pour répondre.