使用Swift if let with logical AND operator&&

时间:2014-08-08 11:44:54

标签: swift expression

我们知道我们可以使用if let语句作为速记来检查可选的nil然后解包。

但是,我想使用逻辑AND运算符&&将其与另一个表达式结合起来。

因此,例如,在这里,我执行可选链接以解包并可选地将我的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语句 switch语句或三元?运算符来执行此操作。

7 个答案:

答案 0 :(得分:127)

从Swift 1.2开始,此 现在可以 Swift 1.2 and Xcode 6.3 beta release notes州:

  

更强大的可选展开如果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,&#34;其中&#34;已被逗号替换。因此,等价物是:

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

答案 1 :(得分:54)

Swift 3 Max MacLeod的示例中如下所示:

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

where替换为,

答案 2 :(得分:36)

Max的答案是正确的,这是一种方法。请注意,当这样写时:

def __init__(self, *pargs): ...

首先解析if let a = someOptional where someBool { }表达式。如果失败则不会评估someOptional表达式(短路评估,正如您所期望的那样)。

如果你想写这个,可以这样做:

someBool

在这种情况下,首先评估if someBool, let a = someOptional { },并且只有当评估为true时才评估someBool表达式。

答案 3 :(得分:4)

这是不可能的。

来自Swift grammar

  

IF声明的语法

     

if-statement→ if if-condition code-block else-clauseopt

     

if-condition→expression |声明

     

else-clause→ else code-block | 其他 if-statement

     

if语句中任何条件的值必须具有符合BooleanType协议的类型。条件也可以是可选的绑定声明,如Optional Binding

中所述

if-condition必须是表达式声明。你不能同时拥有表达和声明。

let foo = bar是一个声明,它不会评估为符合BooleanType的值。它声明了一个常量/变量foo

你的原始解决方案已经足够好了,它比组合条件更具可读性。

答案 4 :(得分:3)

Swift 4 ,我将使用

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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

我认为你原来的主张并不是太糟糕。 (更麻烦的)替代方案是:

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