Testen auf Null in Ziel-C - if (x! = Null) vs if (x)

72

Die meisten Beispiele, die ich im Internet gefunden habe, schreiben Folgendes:

if(x != nil)
    // ...

Gibt es irgendwelche Probleme damit?

if(x)
    // ...

Ich habe beide in einem einfachen Programm ausprobiert und konnte keinen Unterschied feststellen.

kizzx2
quelle

Antworten:

127

In Objective-C nilwird ein Wert definiert __DARWIN_NULL, der aufgerufen wird und im Wesentlichen nach 0oder falsein if-Anweisungen ausgewertet wird . Daher ist Schreiben if (x == nil)dasselbe wie Schreiben if (!x)und Schreiben if (x != nil)ist gleich if (x)(da das Vergleichen mit falseeine Negation erzeugt und das Vergleichen mit trueden Zustand gleich hält).


Sie können Ihren Code so oder so schreiben, und es hängt wirklich davon ab, welcher Code Ihrer Meinung nach besser lesbar ist. Ich finde if (x)es sinnvoller, aber es hängt von Ihrem Stil ab.

Es ist wie der Vergleich im if (someCondition == true)Vergleich if (someCondition).
Es hängt alles von Ihnen ab und davon, wer den Code lesen wird.


Bearbeiten: Wie Yuji richtig erwähnt, wird, da Objective-C eine Obermenge von C ist, jede Bedingung, die mit einem anderen Wert als 0 ausgewertet wird, als wahr angesehen. Wenn someConditionim obigen Beispiel ein ganzzahliger Wert von Sagen wir -1, ein Vergleich mit truewürde dazu führen false, und die if-Anweisung würde nicht ausgewertet. Etwas zu beachten.

Itai Ferber
quelle
12
Ich sollte hinzufügen, dass if(someCondition==true)davon abgeraten wird, da in C-abgeleiteten Sprachen jeder andere Wert als 0 im Prinzip als boolescher wahrer Wert angesehen werden kann, aber aus historischen Gründen, wenn definiert someConditionist -1und dann als falsch ausgewertet wird. true1someCondition==true
Yuji
@ Yuji, das ist richtig. Ich habe versucht zu implizieren, dass dies someConditionzu einem Booleschen Wert führt, aber das ist eine wichtige Warnung.
Itai Ferber
1
Überprüfen Sie den Abschnitt "Arbeiten mit Null" in den Apple-Dokumenten: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… . Wie sie sagen, sind beide Formen in Ordnung. Jedoch passen Sie, dass es subtil und heimtückisch Probleme , wenn Sie versuchen , werfen einen Obj-C Bezug auf BOOL, wie beschrieben in mikeash.com/pyblog/...
Algen
1
also wenn x == 0; würde sich if (x) und if (x! = nil) gleich verhalten?
Erik
@erik Ja, das sollten sie. nilist im Wesentlichen gleich 0, daher werden diese Bedingungen zu if (0)und ausgewertet if (0 != 0), die beide falsch sind.
Itai Ferber
8

Beide

if (x != nil)

und

if ( x )

sind gleichwertig, wählen Sie also die Variante aus, die Ihrer Meinung nach Ihren Code für Sie (und andere, die Ihren Code lesen und unterstützen) besser lesbar macht.

Vladimir
quelle
0

Beide sind gleich und dies ist eine Stilfrage und es kommt darauf an, ob Sie es vorziehen:

  1. Falls etwas) { ... }

    gegen

  2. if (etwas! = nichts) {...}

Ich habe immer festgestellt, dass Nummer 1 klarer ist, aber Nummer 2 wird häufig in der Dokumentation und damit im Feld verwendet. Daher ist es besser, beide Formen zu kennen und sich an die Verwendung eines Projekts anzupassen und stilistisch konsistent zu sein.

Dulio Denis
quelle
0

Der beste und sicherste Weg, um Null zu überprüfen, besteht darin,
eine gemeinsame Methode zu erstellen und alle diese Nullen hinzuzufügen :

+ (NSString *)trimWhiteSpaceAndNewLine:(NSString *)string {
    NSString *stringSource = [NSString stringWithFormat:@"%@",string];
    if ([stringSource isEqualToString:@"(null)"]) {
        stringSource = @"";
        return stringSource;
    }
    if ([stringSource isEqualToString:@"<null>"]) {
        stringSource = @"";
        return stringSource;
    }
    if ([stringSource isEqualToString:@"<nil>"]) {
        stringSource = @"";
        return stringSource;
    }
    if ([stringSource isKindOfClass:[NSNull class]]) {
        stringSource = @"";
        return stringSource;
    }
    if ([stringSource isEqualToString:@""]) {
        stringSource = @"";
        return stringSource;
    }
    if (stringSource == nil) {
        stringSource = @"";
        return stringSource;
    }
    NSString *stringFinal = [stringSource stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    return stringFinal;
}  

Und prüfe

NSString *strUuid = [Common trimWhiteSpaceAndNewLine:[dict valueForKeyPath:@"detail.uuid"]];
        if (![strUuid isEqualToString:@""]) {
            // do your stuff
        }
Mihir Oza
quelle