2013-03-25 8 views

risposta

24

Che cos'è condition? È un BOOL o un NSNumber?


Se condition è un BOOL, allora non si desidera utilizzare o @NO@YES affatto.Si vuole dire

if (condition) // test if condition is true 

if (!condition) // test if condition is false 

if (condition == NO) // same as previous, based on personal preference 

Si noti che non si dovrebbe mai dire

if (condition == YES) 

perché BOOL non è in realtà limitato a 0 e 1 come valori, può contenere qualsiasi cosa in char, quindi se condition tiene accidentalmente , per esempio, 3, quindi if (condition) e if (condition == YES) si comporterebbero in modo diverso.


Se condition è un NSNumber, allora ancora non si desidera utilizzare @NO e @YES. Hai voglia di convertirlo in un BOOL utilizzando -boolValue, come in

if ([condition boolValue]) // test if condition is true 

if (![condition boolValue]) // test if condition is false 

if ([condition boolValue] == NO) // same as previous, based on personal preference 

L'asporto di base è, non utilizzare @NO e @YES letterali per i confronti. È inutile e inelegante, dal momento che tutto ciò che potresti fare con loro è convertirli nuovamente in BOOL s.

+0

Nota che! Condizione e condizione == NO sono ** non ** uguali. C'è un caso limite. Diciamo che la condizione è 256. Questo sarebbe overflow in 0 e uguale a 'NO' poiché è semplicemente un carattere firmato. Tuttavia, l'operatore '!' Restituisce un valore booleano C, che viene definito esplicitamente dallo standard C per essere vero per tutti i valori diversi da zero. Quindi 'BOOL' sarebbe' NO' e 'bool' sarebbe' true' – borrrden

+0

Non importa su questo, l'esempio sopra sembra funzionare da solo. Il caso che mi ha morso è leggermente diverso. Per alcuni casi di BOOL (vale a dire l'overflow a 8 bit) (flag) e (flag == NO) saranno entrambi falsi. – borrrden

+0

È inoltre possibile utilizzare la notazione Objective-C 2.0 per gli accessor per boolValue – HAS

4

Assumendo il tipo di dati di condition è BOOL, poi si desidera:

if (condition) { 
    // true (YES) 
} else { 
    // false (NO) 
} 

se la condizione è un NSNumber quindi utilizzare:

if ([condition boolValue]) { 
    // true (YES) 
} else { 
    // false (NO) 
} 

Se condition si basa su alcuni numeri arbitrari poi trattare 0 come NO e trattare diverso da zero come YES.

Anche in questo caso, se condition è un NSNumber poi fare:

if ([condition intValue]) { 
    // non-zero - true (YES) 
} else { 
    // zero - false (NO) 
} 

Aggiornamento: Sulla base del seguente commento dalla OP:

condizione è un bool, come se (myView. frame.size.height == 30)

Ciò implica che la domanda effettiva voleva d o controlla qualcosa del tipo:

if ((myView.frame.size.height == 30) == YES) 

Questo è molto insolito. La cosa giusta da fare è:

if (myView.frame.size.height == 30) { 
    // true - height is 30 
} else { 
    // false - height is not 30 
} 

Non è necessario preoccuparsi di falsi positivi o negativi. La condizione è o vero o non lo è. Non c'è una terza possibilità. Se la condizione dà il risultato sbagliato, la soluzione è quella di correggere la condizione.

+0

Quali numeri attivano @NO o @YES? – zakdances

+0

Nessuno direttamente. Se 'condition' viene creato da' [NSNumber numberWithBool:] ', si confronta con' @ YES' o '@ NO'. – rmaddy

+1

Il confronto con 'SÌ' potrebbe essere problematico in [alcuni casi] (http://blog.bignerdranch.com/564-bools-sharp-corners/). E +1 per non utilizzare la sintassi del punto per una chiamata al metodo non di proprietà. –

-2

È possibile utilizzare @YES.boolValue e @NO.boolValue.

Così, da confrontare con bool letterale si può scrivere qualcosa di simile (considerato il fatto che è conditionBOOL)

if (condition == @NO.boolValue) { 
    // Do something 
} 
+0

Non so perché questo è stato downvoted. Se 'condition' è un' NSNumber' e l'OP non vuole usare 'isEqual:', allora questa è in realtà una soluzione possibile. – rmaddy

+3

Perché dovresti mai dire "@ NO.boolValue" invece di dire "NO"? –

+0

> Voglio usare valori letterali bool – anticyclope

-1

È condition un NSNumber? In tal caso, utilizzare:

if(condition.integerValue) { 
    //condition is YES 
} else { 
    //condition is NO 
} 

E a proposito, un valore di 0 rappresenta NO, qualsiasi altro valore è SÌ;

2

È possibile salvare @NO in un dizionario perché @NO è un oggetto. Non è possibile salvare NO in un dizionario. Quindi utilizzare @ NO.boolValue quando necessario. Ad esempio:

NSDictionary *userSetting = (NSDictionary *)[[NSUserDefaults standardUserDefaults] objectForKey:@"user"]; 
//Suppose you have done: userSetting[@"canWriteCode"] = @YES; 
if ([userSetting[@"canWriteCode"] boolValue]) 
    [self helloProgrammer];