Wie vergleichen Sie @KEINER und @JA das mit Eleganz und ohne das Risiko von false positives/negatives?
Will ich mit bool-Literale wie
if (condition == @NO) {
}
else if (condition == @YES) {
{
Wenn ich versuche diese, XCode möchte mich NSNumber Methoden zu vergleichen, wie isEqualTo. Gibt es eine einfachere Möglichkeit, dies zu tun (ohne isEqualTo)? Wenn ich es nicht kann, sollte ich isEqualTo, isEqualToValue, oder isEqualToNumber?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist
condition
? Ist es einBOOL
oder eineNSNumber
?Wenn
condition
ist einBOOL
, dann sollten Sie nicht zu verwenden@NO
oder@YES
überhaupt. Sie wollen sagen,Beachten Sie, dass Sie nie sagen sollten,
weil
BOOL
ist nicht wirklich eingeschränkt zu0
und1
als Werte, es kann halt alles inchar
, so dass, wenncondition
versehentlich hält, sagen,3
, dannif (condition)
undif (condition == YES)
anders Verhalten würde.Wenn
condition
ist einNSNumber
, dann sind Sie immer noch nicht verwenden wollen@NO
und@YES
. Sie wollen einfach nur, um Sie zu konvertieren, um eineBOOL
mit-boolValue
wie inDen basic zum mitnehmen hier ist, nicht verwenden
@NO
und@YES
Literale für Vergleiche. Es ist sinnlos, und unelegant, da alles, was Sie möchten in der Lage sein, mit Ihnen zu tun ist, konvertieren Sie Sie zurück inBOOL
s.NO
da es einfach ein signed char. Jedoch, die!
- operator gibt ein C boolean, das ist explizit definiert durch den C-standard, um wahr zu sein für alle Werte außer null an. Also dieBOOL
wäreNO
und diebool
wäretrue
flag == NO
sind definitionsgemäß identisch.YES
Wert (und für einebool
hätte es richtig geklappt hat), aber stattdessen bekam ich einenNO
Wert. Die Lösung war, entweder cast zubool
oder verwenden !!Bedingung (Doppel-nicht-operator, der implizit CASTET zubool
). Ich dachte, für Sie sicher, es wäre in Bezug auf dies, aber es stellt sich heraus, nicht zu sein.Vorausgesetzt, der Datentyp der
condition
istBOOL
sind, dann möchten Sie:If-Bedingung ist ein
NSNumber
dann verwenden:Wenn
condition
basiert auf einige beliebige zahlen, dann behandeln0
alsNO
und Behandlung von nicht-null alsYES
.Wieder, wenn
condition
ist einNSNumber
dann tun:Update: auf der Grundlage der folgenden Bemerkung aus dem OP:
Dies bedeutet, dass die eigentliche Frage machen wollte prüft so etwas wie:
Dies ist sehr ungewöhnlich. Die richtige Sache zu tun ist:
Gibt es keine Notwendigkeit, sorgen über falsche positive oder negative. Die Bedingung ist entweder wahr oder Sie ist es nicht. Es gibt keine 3. Möglichkeit. Wenn die Bedingung falsch ergeben dann die Lösung ist eine Korrektur der Bedingung.
condition
erstellt von[NSNumber numberWithBool:]
dann vergleichen Sie gegen@YES
oder@NO
.YES
problematisch sein könnte, in einige Fälle. Und +1 für die nicht mit dot-syntax für ein non-property-Methode aufrufen.condition
? Wie haben Sie es Wert?condition
und wie sein Wert gesetzt wird, ist es schwer zu festzunageln, die richtige Lösung.condition == YES
, weilBOOL
ist nicht einem wahren booleschen Wert und daher kann ein nicht-null Wert, das ist nicht das gleiche wieYES
. Ähnlich[condition isEqual:@YES]
würde nur funktionieren, wenncondition
erbaut wurdeYES
zu beginnen; wenn es eine nicht-null nicht-YES
Wert, das wird auch scheitern. Und natürlich[condition boolValue] == YES
ist auch schlecht.BOOL
Werte sind nur mitYES
oderNO
dann, was ich habe, ist gut. Persönlich, jeder, weist einen anderen Wert zu einemBOOL
variable ärger (und Sie verwenden es falsch). Was ich gepostet haben, sind nie ein problem in meinem eigenen code, weil ich nur die richtigen Werte mitBOOL
Werte.if (boolValue == YES)
ist nicht das gleiche wieif (boolValue)
mit der ehemaligen unerwartet Auswertung der Bedingung zu0
in einigen Fällen.if (value)
oderif (!value)
mich. Wieder, bis die OP Glockenspiel, meine Antwort ist zugeschnitten auf den Stil der original-code.condition
ist nicht eine variable vom TypBOOL
oderNSNumber
? Jetzt ist deine Frage macht keinen Sinn. Warum würden Sie etwas tun, wieif ((myView.frame.size.height == 30) == YES)
? Ist es das, was Sie wirklich Fragen?Können Sie speichern @KEINE in einem Wörterbuch, weil @KEIN ist ein Objekt. Sie können nicht speichern Sie KEINE in einem Wörterbuch.
So verwenden Sie @NR. boolValue, wenn nötig. Zum Beispiel:
Ist
condition
eineNSNumber
? Wenn ja, nutzen Sie einfach:Und durch die Art und Weise, ein Wert von 0 steht für NEIN, jeder andere Wert wird JA;
Können Sie
@YES.boolValue
und@NO.boolValue
.So, zum Vergleich mit den bool-literal schreiben Sie etwas wie (angesichts der Tatsache, dass
condition
istBOOL
)condition
ist einNSNumber
und die OP nicht möchteisEqual:
ist, dann ist dies tatsächlich eine mögliche Lösung.@NO.boolValue
statt nur zu sagenNO
?