辞書から 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
}
}
しかし、私は 2 つの if let クエリを 1 つにまとめたいと思っています。次のようになります。
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
その構文は機能しないので、それを実行する美しい方法があるかどうか疑問に思いました。
ベストアンサー1
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:
Apple はあなたの質問を読んだ可能性があります。なぜなら、あなたが期待しているコードは Swift 1.2 (現在はベータ版) で正しくコンパイルされるからです。
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
Swift 1.1 以前:
良いニュースがあります。これは完全に可能です。2 つの値のタプルに対する 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")
}
アップデート:このバージョンのコードは正常に動作するようになりました。