web-dev-qa-db-ja.com

Swift if let with logical AND operator &&

if letステートメントを省略形として使用して、オプションのnilを確認してから展開できることを知っています。

ただし、論理AND演算子&&を使用して別の式と組み合わせたいと思います。

そのため、たとえば、ここでオプションのチェーンを実行して、unViewを展開し、オプションでrootViewControllerをtabBarControllerにダウンキャストします。しかし、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")
}

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

だから、質問は可能ですか、もしそうなら正しい構文は何ですか?

ifステートメントでこれを行いたいことに注意してくださいnotswitchステートメントまたは三項?演算子。

83
Max MacLeod

Swift 1.2、この現在可能です. Swift 1.2およびXcode 6.3ベータリリースノート state:

withif 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!")
}
131
Max MacLeod

Swift Max MacLeodの例は次のようになります。

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

where,に置き換えられました

54
ph1lb4

マックスの答えは正解であり、これを行う1つの方法です。ただし、このように記述されている場合は注意してください。

if let a = someOptional where someBool { }

someOptional式が最初に解決されます。失敗した場合、someBool式は評価されません(予想どおり、短絡評価)。

これを他の方法で書きたい場合は、次のようにすることができます:

if someBool, let a = someOptional { }

この場合、someBoolが最初に評価され、trueと評価された場合にのみ、someOptional式が評価されます。

36
par

それは不可能。

Swift grammar から

IFステートメントの文法

if-statement→if­if-condition­ code-block­ else-clause­opt­

if条件→式­ |宣言­

else-clause→else­ code-block­ | else ­if-statement­

Ifステートメントの条件の値は、BooleanTypeプロトコルに準拠する型を持っている必要があります。オプションのバインディングで説明されているように、条件はオプションのバインディング宣言にすることもできます。

if-conditionは式­または宣言­でなければなりません。式と宣言の両方を持つことはできません。

let foo = barは宣言であり、BooleanTypeに適合する値には評価されません。定数/変数fooを宣言します。

元のソリューションは十分であり、条件を組み合わせた場合よりもはるかに読みやすくなっています。

4
Bryan Chen

Swift 4、使用します、

let i = navigationController?.viewControllers.index(of: self)
if let index = i, index > 0, let parent = navigationController?.viewControllers[index-1] {
    // access parent
}
3