2009-12-23 4 views
2

Je suis nouveau à Cocoa, et je travaille dans le livre de Hillegass. J'ai des problèmes avec le défi numéro 2 du chapitre 20.Problème d'état de la case à cocher

Le défi consiste à ajouter des cases à cocher pour basculer si la lettre dessinée est en italique, en gras ou les deux.

-(IBAction)toggleItalic:(id)sender 
{ 
int state = [italicBox state]; 
NSLog(@"state %d", state); 
if (state = 1) { 
    italic = YES; 
    NSLog(@"italic is yes"); 
} 
else { 
    italic = NO; 
    NSLog(@"italic is no"); 

} 
} 

En ce moment, ce bout de code est de retour oui lorsque la case est cochée, et lorsque la case est cochée. Qu'est-ce que je fais mal?

Merci,

Justin.

+0

BTW: Si vous obtenez une réponse qui vous aide, « accepter » il. Cela contribue à donner de la réputation à la partie qui répond, et contourne le «rep repoussé» si elles le frappent ... c'est-à-dire moi. :) – MarkPowell

Répondre

9

Votre problème réside dans votre instruction if:

if (state = 1) { 

vous assignez état à la valeur 1: state = 1, tout ce que vous devez tester est si l'état est actuellement 1: state ==1

C'est une erreur assez courante (surtout dans les langages qui permettent l'affectation dans if). Une astuce pour apprendre à se déplacer est de faire vos chèques de comparaison comme ceci:

if (1 == state) 

Vous ne pouvez pas affecter 1 à une autre valeur. Par conséquent, si vous utilisez par erreur = au lieu de ==, vous obtiendrez une erreur de compilation et c'est une solution facile.

+6

+1 pour l'exactitude. En outre, vous devriez utiliser les enums 'NSOnState' et' NSOffState' au lieu des valeurs numériques directement. Évite les nombres magiques. =) –

+1

Il en va de même pour comparer avec nil/NULL ou n'importe quel autre type de constantes. Dans les langages de style C, il est sage de toujours mettre la constante en premier ('if (nil == someObject)' vous évitera tant de problèmes). – jbrennan

+0

Vous pouvez également activer un avertissement de compilateur, '-Wparentheses' dans GCC ou" accolades manquantes et parenthèses "dans Xcode, qui vous avertira chaque fois que vous faites cette erreur. Vous pouvez ajouter une paire supplémentaire pour les cas où vous voulez réellement dire ceci (par exemple, "' if ((self = [super init])) '"). Et il y a une option du compilateur, '-Werror' /" Traiter les avertissements en tant qu'erreurs ", qui fera un avertissement-y compris celui-ci-casser votre build, de sorte que vous ne pouvez pas manquer ou l'ignorer. –

4

comparaison Utilisez au lieu d'affectation et utiliser les énumérations appropriées au lieu des valeurs hardcoded qui pourraient changer:

if (state == NSOnState) 
else if (state == NSOffState) 
Questions connexes