2016-05-26 9 views
3

In Swift, dann ist es ein gemeinsames if let Muster verwendet optionals auszupacken:Wie entpacke ich ein Optional, wenn Mustervergleichstupel in Swift?

if let value = optional { 
    print("value is now unwrapped: \(value)") 
} 

ich zur Zeit diese Art von Pattern-Matching zu tun, aber mit Tupeln in einem Schaltergehäuse, in dem beide params optionals sind:

//url is optional here 
switch (year, url) { 
    case (1990...2015, let unwrappedUrl): 
     print("Current year is \(year), go to: \(unwrappedUrl)") 
}  

Doch dieser Druck:

"Current year is 2000, go to Optional(www.google.com)" 

gibt es eine Weise, die ich meint optional und Mustererkennung auspacken kann nur, wenn es nicht nil? Derzeit ist meine Abhilfe dies:

switch (year, url) { 
    case (1990...2015, let unwrappedUrl) where unwrappedUrl != nil: 
     print("Current year is \(year), go to: \(unwrappedUrl!)") 
}  

Antwort

8

können Sie die x? Muster verwenden:

case (1990...2015, let unwrappedUrl?): 
    print("Current year is \(year), go to: \(unwrappedUrl)") 

x? ist j ust eine Abkürzung für .some(x), so ist dies gleichbedeutend mit

case (1990...2015, let .some(unwrappedUrl)): 
    print("Current year is \(year), go to: \(unwrappedUrl)") 
0

Sie können wie folgt tun:

switch(year, x) { 
    case (1990...2015,.Some): 
    print("Current year is \(year), go to: \(x!)") 
} 

und Sie können auch tun

switch(year, x) { 
    case (1990...2015, let .Some(unwrappedUrl)): 
    print("Current year is \(year), go to: \(unwrappedUrl)") 
} 
+0

In diesem Beispiel es funktioniert, aber ich wollte nicht wirklich einen expliziten unwrap Operator verwenden, weil ich diese Variable verwenden werde mehr als einmal. Gibt es eine Möglichkeit, es einfach in eine andere Variable auszupacken? –

+0

dann können Sie tun, wie Fall (1990 ... 2015, lassen .Some (unwrappedUrl)): als @Martin R tat. – Sahil