2013-03-25 4 views

Antwort

24

Was ist condition? Ist es ein BOOL oder ein NSNumber?


Wenn condition ist ein BOOL, dann wollen Sie nicht @NO oder @YES überhaupt benutzen.Sie wollen

if (condition) // test if condition is true 

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

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

Anmerkung sagen, dass Sie nie

if (condition == YES) 

weil BOOL tatsächlich nicht beschränkt auf 0 und 1 als Werte sagen sollte, sie etwas in char halten kann, so dass, wenn condition versehentlich hält B. 3, dann if (condition) und if (condition == YES) würden sich anders verhalten.


Wenn condition ein NSNumber, dann noch Sie nicht @NO und @YES verwenden möchten. mit -boolValue, wie 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 

Der Grundservice ist hier nicht verwenden @NO und @YES Literale für Vergleichen Sie wollen es einfach nur ein BOOL konvertieren. Es ist sinnlos und unelegant, da alles, was Sie damit tun können, ist, sie in BOOL s umzuwandeln.

+0

Beachten Sie, dass! Zustand und Zustand == NEIN ** nicht ** gleich sind. Es gibt einen Randfall. Nehmen wir an, Bedingung ist 256. Dies würde in 0 überlaufen und gleich "NEIN" sein, da es einfach ein signiertes Zeichen ist. Der Operator '!' Gibt jedoch einen C-Booleschen Wert zurück, der explizit vom C-Standard für alle anderen Werte als Null als wahr definiert wird. Also wäre der 'BOOL'' NEIN' und der 'Bool' wäre' wahr'. – borrrden

+0

Fehlt das, scheint das obige Beispiel zu funktionieren. Der Fall, der mich gebissen hat, ist etwas anders. Für bestimmte Fälle von BOOL (nämlich der 8-Bit-Überlauf) (Flag) und (Flag == NEIN) werden beide falsch sein. – borrrden

+0

Sie können auch die Objective-C 2.0-Notation für Accessoren für boolValue – HAS

4

der Datentyp condition Unter der Annahme BOOL, dann möchten Sie:

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

Wenn die Bedingung ein NSNumber ist dann verwenden:

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

Wenn condition auf einige beliebige Zahlen basieren dann 0 behandeln als NO und behandle nicht Null als YES.

Auch wenn condition ist ein NSNumber dann tun:

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

aktualisieren: Basierend auf den folgenden Kommentar aus dem OP:

Zustand ist ein Bool, wie if (myView. frame.size.height == 30)

Dies bedeutet, dass die eigentliche Frage d o überprüft etwas wie:

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

Dies ist sehr ungewöhnlich. Die richtige Sache zu tun ist:

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

Es gibt keine Notwendigkeit, sich über falsche Positive oder Negative zu sorgen. Die Bedingung ist entweder wahr oder nicht. Es gibt keine dritte Möglichkeit. Wenn die Bedingung das falsche Ergebnis ergibt, besteht die Lösung darin, die Bedingung zu beheben.

+0

Welche Zahlen lösen @NO oder @YES aus? – zakdances

+0

Keine direkt. Wenn 'condition' aus' [NSNumber numberWithBool:] 'erstellt wird, wird mit' @ YES' oder '@ NO' verglichen. – rmaddy

+1

Ein Vergleich mit 'YES' kann in einigen Fällen problematisch sein (http://blog.bignerdranch.com/564-bools-sharp-corners/). Und +1 für die Verwendung der Punktsyntax für einen Aufruf einer Methode ohne Eigenschaft. –

-2

Sie können @YES.boolValue und @NO.boolValue verwenden.

Also, vergleichen gegen Bool wörtliche Sie so etwas wie (angesichts der Tatsache, dass condition ist BOOL)

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

Ich weiß nicht, warum das abgelehnt wurde. Wenn "condition" eine "NSNumber" ist und das OP nicht "isEqual:" verwenden möchte, ist dies tatsächlich eine mögliche Lösung. – rmaddy

+3

Warum würdest du jemals '@ NO.boolValue' sagen anstatt nur' NO' zu sagen? –

+0

> Ich möchte Bool Literale verwenden – anticyclope

-1

Ist condition ein NSNumber schreiben kann? Wenn ja, verwenden Sie einfach:

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

Und übrigens, ein Wert von 0 bedeutet NEIN, jeder andere Wert ist JA;

2

Sie können @NO in einem Wörterbuch speichern, da @NO ein Objekt ist. Sie können NO in einem Wörterbuch nicht speichern. Verwenden Sie daher @ NO.boolValue, wenn erforderlich. Zum Beispiel:

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