How do I unwrap an Optional when pattern matching tuples in Swift?

本小妞迷上赌 提交于 2019-12-18 08:10:13

问题


In Swift, there's a common if let pattern used to unwrap optionals:

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

I'm currently doing this kind of pattern matching, but with tuples in a switch case, where both params are optionals:

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

However, this prints:

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

Is there a way I can unwrap my optional and pattern match only if it's not nil? Currently my workaround is this:

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

回答1:


You can use the x? pattern:

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

x? is just a shortcut for .some(x), so this is equivalent to

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



回答2:


with a switch case you can unwrap (when needed) and also evaluate the unwrapped values (by using where) in the same case.

Like this:

let a: Bool? = nil
let b: Bool? = true

switch (a, b) {
case let (unwrappedA?, unwrappedB?) where unwrappedA || unwrappedB:
  print ("A and B are not nil, either A or B is true")
case let (unwrappedA?, nil) where unwrappedA:
  print ("A is True, B is nil")
case let (nil, unwrappedB?) where unwrappedB:
  print ("A is nil, B is True")
default:
  print("default case")
}



回答3:


you can do like this:

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

and you can also do

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


来源:https://stackoverflow.com/questions/37452118/how-do-i-unwrap-an-optional-when-pattern-matching-tuples-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!