2015-12-13 12 views
23

próbuję napisać następujący fragment kodu w jednym if let line:Używanie „jeśli niech” z logicznego „lub” operator

if let amount = datasource?.incrementForCount?(count) { 

     count += amount 
    } 

    else if let amount = datasource?.fixedIncrement { 
     count += amount 
    } 

gdy próbuję coś takiego:

if let amount = datasource?.incrementForCount?(count) || let amount = datasource?.fixedIncrement { 

     count += amount 
    } 

Mam błąd czasu kompilacji.

Nie sądzę, że klauzula where jest możliwa w tym przypadku.

Czy można połączyć dwa oświadczenia if let w jeden numer ?

Odpowiedz

19

spróbuje użyć ?? operatora:

if let amount = datasource?.incrementForCount?(count) ?? datasource?.fixedIncrement 
{ 
    count += amount 
} 

to możliwe, aby połączyć 2, jeśli niech oświadczenia w jeden ored?

Jest możliwe, aby mieć kilka let wypowiedzi jak

if let a = optionalA, b = optionalB { ... } 

i wszystkie z nich powinien zwrócić wartość non-nil przekazać.

Ale jeśli chcesz używać warunek logiczny go:

  1. może być tylko jeden
  2. należy umieścić na pierwszym miejscu, przed jakimkolwiek niech oświadczenia
+0

Czy istnieje czyściejsze rozwiązanie do wykorzystania, gdy istnieją dodatkowe warunki ORed zamiast gniazdowania? regulaminy operatora? – JAHelia

+0

@JAHelia Nie. Możesz mieć tylko jeden warunek logiczny w wyrażeniu if (nie "where") i powinien on być umieszczony na pierwszym miejscu, przed każdym wyrażeniem "let". – Avt

7

Nie, nie można wykonać dwóch instrukcji if-let ani nawet instrukcji if-let z warunkiem non-let, ponieważ byłoby to całkowicie sprzeczne z celem instrukcji if-let. if-let zapewnia, że ​​można wprowadzić tylko treść instrukcji, jeśli opcjonalne z powodzeniem można rozpakować w zmiennej.

let str:String? = nil 
if let s = str || true { 
    //s is nil, yet you're still in the if-let body 
} 

W powyższym przykładzie będzie jeszcze wprowadzić opcjonalny ciało nawet jeśli s były zerowe, w takim przypadku będzie trzeba jeszcze sprawdzić czy s jest zerowa lub nie w ciele, czyniąc pierwszy if-let check bezcelowe.