Swift 1.2增加了在单个if
语句中展开多个选项的功能,以及同时测试条件的能力:
if let a = optionalA, b = optionalB where a.foo == b.bar && a.frob == b.nicate {
// unwrapping successful
}
这引入了一个双层次的条件:只有当选项成功解包时,评估才会向前移动,并且只有在满足每个条件时才会向前移动。那么我的问题是它们是如何交错的?在if
声明中评估条件的时间是什么时候?
我问,因为我想做这样的事情:
if let b = foo(i - 1) where i > 0 {
// code
}
在此示例中,如果使用负值调用foo
,则会产生有害的副作用。
答案 0 :(得分:2)
目前看来,where
子句在之后被称为,所有if let
检查都是在没有nil
的情况下完成的。为了更深入地了解它是如何工作的,我建议Nate Cooks博客。他在this blogpost上提到了这一点。
使用新语法,依次评估每个绑定,停止if 任何尝试的绑定都是零。 仅在所有可选项之后 绑定是成功的是检查where子句。
所以看起来你必须按照之前的方式进行i > 0
检查,然后再进行解包。