2017-02-02 2 views
-3

Die if-Anweisung unten fängt nicht loc! .speed < 1.0. Warum?Swift IF-Anweisung Fehler?

if loc == nil || loc!.speed < 1.0, self.tripOver 
{ 
    return 
} 

jedoch die if-Anweisung unten arbeitet

if loc == nil || loc!.speed < 1.0 || self.tripOver 
{  
    return 
} 

Die obige if-Anweisung tut Fang loc! .Speed ​​< 1.0 und ordnungsgemäß zurückgibt.

Warum swift nicht den zweiten Teil des bedingten Ausdruck auswerten, wenn es eine ist ‚‘ einen anderen Teil der Aussage zu trennen?

Das sieht aus wie ein Bug zu mir.

+3

Die Anweisungen sind nicht äquivalent - das Äquivalent von 'if loc == nil || loc! .speed <1.0, self.tripOver {...} '' ist if (loc == null || loc! .speed <1.0) && self.tripOver {...} ' – Hamish

+3

es ein Fehler _is_. _Ihr_ Fehler. – matt

+0

Gegeben das zweite Schnipsel ist in der Tat die Logik, nach der Sie suchen, eine Alternative ist z.B. Kombinieren der Bedingung von "loc" ist nicht-'nil' mit dem Prädikat über die' loc': s Mitglied 'speed':' if loc.map ({$ 0.Speed ​​<1.0 || self.tripOver}) ?? Wahr {Rückkehr} '. Oder optional Bindung verwenden und wechseln Sie zu einem 'guard' Klausel für den frühen' return' (Umdrehen der Logik), 'Wache lassen nonOptLoc = loc, nonOptLoc.speed> = 1,! Self.tripOver else {return}'. – dfri

Antwort

4

Die beiden Aussagen sind nicht die gleichen. Die erste:

if loc == nil || loc!.speed < 1.0, self.tripOver{...} 

kann ersetzt werden durch:

if ((loc == nil || loc!.speed < 1.0) && self.tripOver){...} 

Also, wenn self.tripOver ist falsch, die erste Bedingung falsch ist, so dass die Anweisung nicht ausgeführt. Aber in der zweiten Bedingung, auch wenn self.tripOver ist falsch, wenn die anderen Bedingungen führen zu wahr, dann führt die Anweisung.


LOGIC:

  1. Erste Bedingung, unter der Annahme, dass self.tripOver ist falsch, und dass die anderen Bedingungen sind wahr:

    if true || true && false => false // doesn't execute statement 
    

    oder

    if true && false => false  // doesn't execute statement 
    
  2. Zweite Bedingung, mit den gleichen Annahmen wie oben:

    if true || true || false => true // executes statement 
    

PS: Bitte nicht Ihre Schuld auf den Compiler