1. ホーム
  2. swift

[解決済み] Swiftのif letと論理AND演算子&&の使い分け

2022-12-04 03:27:46

質問

私たちは if let ステートメントを省略記法として使用し、オプションのnilをチェックし、アンラップすることができます。

しかし、私はそれを論理AND演算子を使った別の式と組み合わせたいのです。 && .

例えば、ここではrootViewControllerからtabBarControllerへのunwrapとdowncastをオプションでチェーニングしています。しかし、ネストされたif文ではなく、それらを組み合わせたいと思います。

if let tabBarController = window!.rootViewController as? UITabBarController {
    if tabBarController.viewControllers.count > 0 {
        println("do stuff")
     }
 }

合わせて寄付する。

if let tabBarController = window!.rootViewController as? UITabBarController &&
    tabBarController.viewControllers.count > 0 {
        println("do stuff")
     }
}

上記の場合、コンパイルエラーが発生します。 未解決の識別子 'tabBarController' を使用しています。

簡略化します。

if let tabBarController = window!.rootViewController as? UITabBarController && true {
   println("do stuff")
}

これはコンパイルエラーになります 条件付きバインディングのバウンド値はOptional型でなければなりません。 . 様々な構文のバリエーションを試しましたが、それぞれ異なるコンパイラーエラーが発生します。順序と括弧の必勝の組み合わせはまだ見つかっていません。

そこで質問ですが、それは可能ですか、もし可能なら、正しい構文は何ですか。

私はこれを if ステートメント ではなく a switch ステートメントや三項 ? 演算子を使用します。

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

Swift 1.2 の時点で、この が可能になりました。 . その Swift 1.2 と Xcode 6.3 のベータ版リリースノート の状態になります。

でより強力なオプショナル・アンラップ if let - if let 構造体 は複数のオプショナルを一度にアンラップできるようになり、また、間にブール条件を含むことができるようになりました。 を含むことができるようになりました。これにより、不要な入れ子をすることなく、条件付き 不必要な入れ子なしで制御フローを表現できます。

上記の記述で、構文は次のようになります。

if let tabBarController = window!.rootViewController as? UITabBarController where tabBarController.viewControllers.count > 0 {
        println("do stuff")
}

これは where 節を使用しています。

別の例では、今度は AnyObjectInt に変更し、オプショナルをアンラップし、アンラップされたオプショナルが条件を満たしているかどうかをチェックします。

if let w = width as? Int where w < 500
{
    println("success!")
}

現在Swift 3を使用している人のために、"where"はカンマに置き換えられました。したがって、同等のものは次のようになります。

if let w = width as? Int, w < 500
{
    println("success!")
}