With Swift 3, you can use optional chaining, switch statement or optional pattern in order to solve your problem.
1. Using if let
(optional binding / optional chaining)
The Swift Programming Language states about optional chaining:
Multiple queries can be chained together, and the entire chain fails gracefully if any link in the chain is nil.
Therefore, in the simplest case, you can use the following pattern to use multiple queries in your optional chaining operation:
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if let latitude = latitude as? Double, let longitude = longitude as? Double {
print(latitude, longitude)
}
// prints: 2.0 10.0
2. Using tuples and value binding in a switch statement
As an alternative to a simple optional chaining, switch statement can offer a fine grained solution when used with tuples and value binding:
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude, longitude) {
case let (Optional.some(latitude as Double), Optional.some(longitude as Double)):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude, longitude) {
case let (latitude as Double, longitude as Double):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude as? Double, longitude as? Double) {
case let (.some(latitude), .some(longitude)):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude as? Double, longitude as? Double) {
case let (latitude?, longitude?):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
3. Using tuples with if case
(optional pattern)
if case
(optional pattern) provides a convenient way to unwrapped the values of optional enumeration. You can use it with tuples in order to perform some optional chaining with multiple queries:
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (.some(latitude as Double), .some(longitude as Double)) = (latitude, longitude) {
print(latitude, longitude)
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (latitude as Double, longitude as Double) = (latitude, longitude) {
print(latitude, longitude)
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (.some(latitude), .some(longitude)) = (latitude as? Double, longitude as? Double) {
print(latitude, longitude)
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (latitude?, longitude?) = (latitude as? Double, longitude as? Double) {
print(latitude, longitude)
}
// prints: 2.0 10.0