1. ホーム
  2. if-statement

[解決済み] Swiftでif文の中で複数のlet-asを使用する

2022-04-27 05:37:21

質問

辞書から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
}

その構文ではうまくいかないので、美しい方法がないかと考えていました。

どのように解決するのですか?

Swift 3に対応したアップデートを行いました。

以下は、Swift 3で動作します。

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
    // latitudeDouble and longitudeDouble are non-optional in here
}

オプショナルバインディングの試みが失敗した場合、その中のコードも失敗することを覚えておいてください。 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文は、パターンマッチングを使って2つの値をそれぞれ 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")
}

更新しました。 このバージョンのコードは正しく動作するようになりました。