2014-07-15 6 views
1

Je suis nouveau à l'objectif C et j'essaie de l'apprendre. J'essaye d'écrire le programme de calculatrice qui effectue le calcul mathématique simple (l'addition, la soustraction et ainsi de suite).Objectif C: Array

Je souhaite créer un tableau stockant des nombres (valeur double) et des opérandes. Maintenant, ma méthode de pushOperand prend ID comme ci-dessous:

-(void) pushOperand:(id)operand 
{ 
    [self.inputStack addObject:operand]; 

} 

lorsque je tente de pousser à double valeur comme ci-dessous:

- (IBAction)enterPressed:(UIButton *)sender 
{ 

    [self.brain pushOperand:[self.displayResult.text doubleValue]]; 
} 

Il donne mon erreur suivant: "Sending 'double' to parameter of incompatible type 'id'"

Je vous serais reconnaissant si vous les gars peuvent répondre à mes questions suivantes:

  1. 'id' est un type générique s o Je suppose que cela fonctionnera avec n'importe quel type sans donner d'erreur ci-dessus. Pouvez-vous s'il vous plaît m'aider à comprendre la véritable raison de l'erreur?

  2. Comment puis-je résoudre cette erreur?

Répondre

1

id est un pointeur à une classe. Par conséquent, il ne fonctionne pas avec les types primitifs tels que double ou int qui ne sont ni des pointeurs, ni des objets. Pour stocker un type primitif dans un NSArray, il faut d'abord envelopper la primitive dans un objet NSNumber. Cela peut être fait en utilisant alloc/init ou avec la nouvelle création d'objet de style, comme indiqué dans les deux extraits ci-dessous.

style ancien

NSNumber *number = [[NSNumber alloc] initWithDouble:[self.displayResult.text doubleValue]]; 
[self.brain pushOperand:number]; 

nouveau style

NSNumber *number = @([self.displayResult.text doubleValue]); 
[self.brain pushOperand:number]; 
1

Je suggère d'utiliser avec un NSNumber: Essayez de ne pas abuser de l'aide id où vous n'avez pas besoin; beaucoup de problèmes peuvent survenir si ce n'est pas le cas.

- (void)pushOperand:(NSNumber *)operand 
{ 
    [self.inputStack addObject:operand]; 
} 

- (IBAction)enterPressed:(UIButton *)sender 
{ 
    [self.brain pushOperand:@([self.displayResult.text doubleValue])]; 
} 
+0

Vous devez également être en mesure d'utiliser le @ sténographie ([self.displayResult.text doubleValue]) plutôt que [ NSNumber numberWithDouble: [self.displayResult.text doubleValue]] pour le rendre un peu plus concis, mais oui, vous ne pouvez pas pousser les primitives dans un tableau d'objectif-C ou passer comme objet-c cible générique (id) car ce n'est pas un objet. – Mike