我们知道我们可以使用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
语句或三元?
运算符来执行此操作。
答案 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)
这是不可能的。
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")
}