辞書から2つの値をアンラップします。それらを使用する前に、それらをキャストし、適切なタイプをテストする必要があります。これは私が思いついたものです:
var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]
if let latitudeDouble = latitude as? Double {
if let longitudeDouble = longitude as? Double {
// do stuff here
}
}
しかし、クエリを1つにした場合、2つをまとめたいと思います。そのため、次のようになります。
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
その構文は機能していませんので、それを実現する美しい方法があるのだろうかと考えていました。
Swift 3:の更新
以下はSwift 3で機能します:
if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
// latitudeDouble and longitudeDouble are non-optional in here
}
試行されたオプションバインディングの1つが失敗した場合、if-let
ブロック内のコードは実行されないことに注意してください。
注:句はすべて「let」句である必要はありません。コンマで区切った一連のブールチェックを使用できます。
例えば:
if let latitudeDouble = latitude as? Double, importantThing == true {
// latitudeDouble is non-optional in here and importantThing is true
}
Swift 1.2:
希望するコードがSwift 1.2(今日のベータ版)で適切にコンパイルされるため、Appleはあなたの質問を読んだかもしれません。
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
Swift 1.1以前:
ここに良いニュースがあります-あなたはこれを完全に行うことができます。 2つの値のTupleのswitchステートメントは、パターンマッチングを使用して、両方を同時にDouble
にキャストできます。
var latitude: Any! = imageDictionary["latitude"]
var longitude: Any! = imageDictionary["longitude"]
switch (latitude, longitude) {
case let (lat as Double, long as Double):
println("lat: \(lat), long: \(long)")
default:
println("Couldn't understand latitude or longitude as Double")
}
更新:このバージョンのコードは正常に動作するようになりました。
Swift 3.0
if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
// do stuff here
}
Swift 3では、問題を解決するために、オプションのチェーン、switchステートメント、またはオプションのパターンを使用できます。
if let
の使用(オプションのバインディング/オプションのチェーン)Swift Programming Language は、オプションの連鎖について述べています。
複数のクエリをチェーン化できます。チェーン内のリンクがnilの場合、チェーン全体が正常に失敗します。
したがって、最も単純な場合、次のパターンを使用して、オプションの連鎖操作で複数のクエリを使用できます。
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
単純なオプションの連鎖の代替として、 switch statement は、タプルと値バインディングと一緒に使用すると、きめ細かいソリューションを提供できます。
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
if case
でのタプルの使用(オプションのパターン)if case
( optional pattern )は、オプションの列挙の値をアンラップする便利な方法を提供します。複数のクエリでオプションの連鎖を実行するために、タプルで使用できます。
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