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
ステートメントまたは三項?
演算子。
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
句を使用します。
別の例、今度はAnyObject
をInt
にキャストし、オプションをアンラップし、アンラップされたオプションが条件を満たしていることを確認します。
if let w = width as? Int where w < 500
{
println("success!")
}
Swift 3を使用している場合、「where」はコンマに置き換えられています。したがって、同等のものは次のようになります。
if let w = width as? Int, w < 500
{
println("success!")
}
Swift Max MacLeodの例は次のようになります。
if let tabBarController = window!.rootViewController as? UITabBarController, tabBarController.viewControllers.count > 0 {
println("do stuff")
}
where
は,
に置き換えられました
マックスの答えは正解であり、これを行う1つの方法です。ただし、このように記述されている場合は注意してください。
if let a = someOptional where someBool { }
someOptional
式が最初に解決されます。失敗した場合、someBool
式は評価されません(予想どおり、短絡評価)。
これを他の方法で書きたい場合は、次のようにすることができます:
if someBool, let a = someOptional { }
この場合、someBool
が最初に評価され、trueと評価された場合にのみ、someOptional
式が評価されます。
それは不可能。
IFステートメントの文法
if-statement→ifif-condition code-block else-clauseopt
if条件→式 |宣言
else-clause→else code-block | else if-statement
Ifステートメントの条件の値は、BooleanTypeプロトコルに準拠する型を持っている必要があります。オプションのバインディングで説明されているように、条件はオプションのバインディング宣言にすることもできます。
if-conditionは式または宣言でなければなりません。式と宣言の両方を持つことはできません。
let foo = bar
は宣言であり、BooleanType
に適合する値には評価されません。定数/変数foo
を宣言します。
元のソリューションは十分であり、条件を組み合わせた場合よりもはるかに読みやすくなっています。
Swift 4、使用します、
let i = navigationController?.viewControllers.index(of: self)
if let index = i, index > 0, let parent = navigationController?.viewControllers[index-1] {
// access parent
}